Verilog с cocotb: инструкция присваивания

мой код verilog - сумматор, который просто использует assign sum = a+b. Проблема в том, что при запуске с использованием cocotb, sum остается неизвестным, хотя a и b имеют допустимые значения. когда я делаю sum тип reg, он работает.

`timescale 1 ns / 1 ps

module adder(input [7:0] a,
        input [7:0] b,
        output reg  [7:0] sum,
        output [7:0] sum2);

    assign sum2=a+b;        //Trouble is here
    always@(a,b) begin
        sum=a+b;            //This works
    end

`ifdef COCOTB_SIM
    initial begin
        $dumpfile("adder.vcd");
        $dumpvars();
    end
`endif
endmodule

gtkwave output


person n.r    schedule 08.11.2015    source источник


Ответы (1)


Я считаю, что это на самом деле вызвано ошибкой в ​​Icarus, присутствующей в v0.9.7.

Если вы обновитесь до последней разрабатываемой версии, вы обнаружите, что непрерывное назначение работает нормально. Другие симуляторы также отлично справляются с непрерывным назначением.

Если вы застряли на этой версии Icarus, вы можете обойти это, поместив назначение внутри процесса, как вы обнаружили.

person Chiggs    schedule 08.11.2015
comment
Я так понимаю, изображение формы волны, очевидно, показывающее окна Gtkwave, подсказало вам использование Icarus? - person ; 09.11.2015
comment
@ user1155120 GTKWave - это бесплатная распродажа, но некоторые люди также столкнулись с этой проблемой. К сожалению, большинство репозиториев популярных дистрибутивов Linux по-прежнему содержат Icarus v0.9.7. - person Chiggs; 09.11.2015
comment
@Chiggs Привет, Крис, я создал новый тег cocotb, потому что на SO появляется все больше и больше вопросов и ответов, связанных с cocotb. Может быть, вы хотите подписаться на него. - person Paebbels; 02.03.2016
comment
@Paebbels, спасибо за это, подпишусь и постараюсь помочь людям, где смогу - person Chiggs; 03.03.2016