Код тестовой среды Verilog с использованием gEDA и iVerilog

Мое задание - закодировать простой декодер от 2 до 4, а затем отобразить возможные результаты и форму волны.

Я использую пакет gEDA вместе с Icarus Verilog (iVerilog) в качестве компилятора и GTKWave для формы волны.

Я впервые пишу код на Verilog или работаю с пакетом gEDA. Из Google кажется, что мне нужно следовать этому процессу проектирования:

  1. подумайте о дизайне, который хотите воплотить в жизнь. В моем случае декодер
  2. реализовать дизайн на VHDL / Verilog.
  3. реализовать тестовую среду в VHDL / Verilog.
  4. Скомпилируйте файл дизайна и файл тестовой среды с помощью iVerilog
  5. Используйте testbench и файл дампа .vcd для отображения формы волны с помощью GTKWave

Файл тестовой среды не компилируется, и я не знаю почему. Я пробовал несколько вариантов и продолжаю получать ошибки. Любая помощь очень ценится. Спасибо.

Вот мой код файла дизайна:

// 2 to 4 Decoder
// File Name: decoder.v

module decoder(X,Y,E,Z);
    input X,Y,E;
    output [0:3]Z;
    wire [0:3]Z;
    wire X1, Y1;

    not
        inv1(X1,X),
        inv2(Y1,Y);
    and
        and1(Z[0],X1,Y1,E),
        and2(Z[1],Y1,X,E),
        and3(Z[2],Y,X1,E),
        and4(Z[3],X,Y,E);
endmodule

Вот мой код тестового стенда:

module decoder_tb;
    input X,Y,E;
    output [0:3]Z;
    //wire [0:3]Z;
    //wire X1, Y1;  

    // should create .vcd dump file for GTKWave
    initial
        begin
            $dumpfile("decoder.vcd");
            $dumpvars();    
        end

    decoder decode(X,Y,E,Z);
    initial 
        begin
            $display($time,"<< Z[0]=%d   Z[1]=%d   Z[2]=%d   Z[3]=%d >>", Z[0] , Z[1] , Z[2] , Z[3] );  
        end 

    initial 
        begin 
         #0
         X = 0; Y = 0; E = 1; 
         #5 
         X = 0; Y = 1; E = 1;
         #10 
         X = 1; Y = 0; E = 1;
         #15 
         X = 1; Y = 1; E = 1;
        end 
endmodule

Я использую следующие команды в терминале:

iverilog -o decoder.vvp decoder.v decoder_tb.v
gtkwave decoder.vcd

РЕДАКТИРОВАТЬ: вот точное сообщение об ошибке

aj@aj:~/verilogCode$ iverilog -o decoder.vvp decoder.v decoder_tb.v
decoder_tb.v:26: error: X is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : X is declared here as wire.
decoder_tb.v:26: error: Y is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : Y is declared here as wire.
decoder_tb.v:26: error: E is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : E is declared here as wire.
decoder_tb.v:28: error: X is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : X is declared here as wire.
decoder_tb.v:28: error: Y is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : Y is declared here as wire.
decoder_tb.v:28: error: E is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : E is declared here as wire.
decoder_tb.v:30: error: X is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : X is declared here as wire.
decoder_tb.v:30: error: Y is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : Y is declared here as wire.
decoder_tb.v:30: error: E is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : E is declared here as wire.
decoder_tb.v:32: error: X is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : X is declared here as wire.
decoder_tb.v:32: error: Y is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : Y is declared here as wire.
decoder_tb.v:32: error: E is not a valid l-value in decoder_tb.
decoder_tb.v:6:      : E is declared here as wire.
12 error(s) during elaboration.

person milleraj66    schedule 25.11.2014    source источник


Ответы (1)


На вашем стенде измените input на reg и output на wire. Это исправляет ошибки компиляции для меня (хотя я не использую gEDA или iVerilog):

module decoder_tb;
    reg X,Y,E;
    wire [0:3]Z;

В этом случае мои симуляторы выдавали гораздо более значимые сообщения об ошибках, чем ваш:

Идентификатор «X» не отображается в списке портов.

person toolic    schedule 25.11.2014