如何在测试台上运行verilog代码?

如何在测试台上运行verilog代码?,verilog,system-verilog,iverilog,Verilog,System Verilog,Iverilog,我为ripple进位加法器编写了代码。测试台也可用。如何在我的Verilog代码上运行这个测试台?我没有模拟器。我正在使用iverilog编译器 纹波进位加法器.v module half_adder(a,b,sum,carry); input a,b; output sum,carry; assign sum=a^b; assign carry=a&b; endmodule module full_adder(a,b,cin,sum,cout); in

我为ripple进位加法器编写了代码。测试台也可用。如何在我的Verilog代码上运行这个测试台?我没有模拟器。我正在使用
iverilog
编译器

纹波进位加法器.v

module half_adder(a,b,sum,carry);
   input a,b;
   output sum,carry;
   assign sum=a^b;
   assign carry=a&b;
endmodule


module full_adder(a,b,cin,sum,cout);
   input a,b,cin;
   output sum,cout;
   wire   t1,t2;
   half_adder h(a,b,t1,t2);
   assign cout=t1&cin;
   assign sum=t1^cin;
   assign cout=t2|cout;
endmodule // full_adder

module ripple_carry_adder(input1,input2,answer);
   input [31:0] input1,input2;
   output [31:0] answer;
   wire [31:0]   carry;
   full_adder f(input1[0],input2[0],1'b0,answer[0],carry[0]);
   genvar            i;
   generate
      for(i=1;i<=31;i=i+1)
        begin : my_mabel
           full_adder f(input1[i],input2[i],carry[i-1],answer[i],carry[i]);
        end
   endgenerate
endmodule
使用:

在终端中编译和运行代码。您可以向测试台添加一个
$monitor
,以便能够打印更多的结果,而不仅仅是错误

还有一个名为
GTKWave
的配套程序,允许您绘制波形。

使用:

在终端中编译和运行代码。您可以向测试台添加一个
$monitor
,以便能够打印更多的结果,而不仅仅是错误


还有一个名为
GTKWave
的配套程序,允许您绘制波形。

结果窗格上的代码还显示了它运行的命令:
iverilog-Wall design testbench&&unbuffer vvp a.out
@VictorLyuboslavsky输出未正确显示。在这里,您的代码使用工作模式进行了修改
$monitor
:。Icarus和其他模拟器之间似乎确实存在行为差异。这应该是另一个问题。@VictorLyuboslavsky为什么实际变量X的输出是?另外,,在某些情况下,即使是预期值也有错误的输出。请为此新主题创建一个关于代码/测试台功能行为的新StackOverflow问题。结果窗格中的代码也显示了它运行的命令:
iverilog-Wall design testbench&&unbuffer vvp a.out
@VictorLyuboslavsky输出为未正确显示。在这里,您的代码已被使用的
$monitor
修改:。Icarus和其他模拟器之间似乎确实存在行为差异。这应该是另一个问题。@VictorLyuboslavsky为什么实际变量X的输出是?此外,在某些情况下,即使是预期值也有错误的输出。请为此新主题创建一个关于代码/testbench.Nope的功能行为的新StackOverflow问题。嗯……如果灵敏度列表中的一个元素更改了其值,监视器也会打印该值,我如何避免这种情况,并在为input1和input2分配了值并计算了实际值和预期值后打印该值?否。嗯……如果灵敏度列表中的一个元素更改了其值,监视器也会打印该值,我如何避免这种情况,并在为input1和input2分配了值并计算了实际值和预期值后打印该值?
module test;

reg [31:0] input1,input2, expected;
wire [31:0] actual;
integer seed;

ripple_carry_adder dut(input1,input2,actual);

initial begin
    seed = 0;
    repeat(10) begin
        input1 = $random(seed);
        input2 = $random(seed);
        expected = input1 + input2;
        #1;
        if(actual!=expected) $display("ERROR: %0d+%0d was %0d expected %0d",
            input1,input2,actual, expected);
        #9;
    end
end

endmodule
$ iverilog -o ripple ripple_carry_adder.v ripple_carry_adder_tb.v
$ vvp ripple