使用 gEDA 和 iVerilog 的 Verilog 测试平台代码

Posted

技术标签:

【中文标题】使用 gEDA 和 iVerilog 的 Verilog 测试平台代码【英文标题】:Verilog testbench code using gEDA and iVerilog 【发布时间】:2014-11-25 02:27:48 【问题描述】:

我的任务是编写一个简单的 2 到 4 解码器,然后显示可能的结果和波形。

我将 gEDA 套件与 Icarus Verilog (iVerilog) 一起用作编译器,并将 GTKWave 用于波形。

这是我第一次使用 Verilog 编码或使用 gEDA 套件。从谷歌搜索看来我需要遵循这个设计流程:

    想一想您要实施的设计。在我的例子中是一个解码器 用 VHDL/Verilog 实现设计。 在 VHDL/Verilog 中实现测试平台。 使用 iVerilog 编译设计文件和测试台文件 使用 testbench 和 .vcd 转储文件通过 GTKWave 显示波形

testbench 文件无法编译,我不知道为什么,我尝试了几种变体,但一直出现错误。任何帮助深表感谢。谢谢。

这是我的设计文件代码:

// 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.

【问题讨论】:

【参考方案1】:

在您的测试台中,将input 更改为reg 并将output 更改为wire。这为我修复了编译错误(尽管我没有使用 gEDA 或 iVerilog):

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

在这种情况下,我的模拟器给出的错误信息比你的更有意义:

标识符“X”未出现在端口列表中。

【讨论】:

以上是关于使用 gEDA 和 iVerilog 的 Verilog 测试平台代码的主要内容,如果未能解决你的问题,请参考以下文章

全平台轻量开源verilog仿真工具iverilog+GTKWave使用教程

cpu设计和实现(iverilog工具)

cpu设计和实现(iverilog工具)

iverilog 测试台错误:输入被声明为线,但它不是

无法在iverilog中编译unisim代码

iverilog递归函数导致分段错误