首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试4位加法器

测试4位加法器
EN

Stack Overflow用户
提问于 2022-11-20 21:57:50
回答 2查看 49关注 0票数 0

我试着做一个4位加法器并测试它。我决定使用wait来确定何时完成加法器电路,方法是检查sumcarry_out何时为>= 0。电路的输入作为命令行参数给出。我正在用我的全加器构造我的4位加法器,我可以用这个方法成功地测试。

full_adder.v

代码语言:javascript
复制
//Behavioral Verilog
module full_adder (input a, input b, input cin, output s, output cout);
    assign s = a ^ b ^ cin;
    assign cout = (a && b) || (a && cin) || (b && cin);
endmodule

4_bit_adder.v

代码语言:javascript
复制
module four_bit_adder(input [0:3] x, input [0:3] y, input carry_in, output [0:3] sum, output carry_out);
    full_adder add1(x[0], y[0], sum[0], carry_in, carry1);
    full_adder add2(x[1], y[1], sum[1], carry1, carry2);
    full_adder add3(x[2], y[2], sum[2], carry2, carry3);
    full_adder add4(x[3], y[3], sum[3], carry3, carry_out);
endmodule

4_bit_adder_tester.v

代码语言:javascript
复制
module four_bit_adder_test;
    reg [0:3]x;
    reg [0:3]y;
    reg carry_in;
    wire sum;
    wire carry_out;
    four_bit_adder adder(x, y, carry_in, sum, carry_out);

    initial begin
        $display("Here");
        if (!$value$plusargs("x=%d", x)) begin
            $display("ERROR: please specify +x=<value> to start.");
            $finish;
        end   
        if (!$value$plusargs("y=%d", y)) begin
            $display("ERROR: please specify +y=<value> to start.");
            $finish;
        end
        if (!$value$plusargs("carry_in=%d", carry_in)) begin
            $display("ERROR: please specify +carry_in=<value> to start.");
            $finish;
        end
        wait(sum >= 0 && carry_out>= 0) $display("sum=%d, carry_out=%d", sum, carry_out);
        $finish;
    end
endmodule

问题是carry_out保持在x,所以sumcarry_out变量永远不会被打印出来。我试着打印出carry_out的值,我认为我的电路中的逻辑应该能工作。这是测试Verilog代码的有效方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-21 01:53:05

这不是一种推荐的测试方法,因为如果数据不正确,则没有输出。

更好的方法是检查输出是否与您期望的匹配。

代码语言:javascript
复制
   $display("Expected %b + %b + %b = %b", x,y,carry_in, {x+y+carry_in});
   #1 // let output propagate
      if ( {carry_out,sum} == x + y + carry_in )
        $display("passed sum=%b, carry_out=%b", sum, carry_out);
      else
        $display("failed sum=%b, carry_out=%b", sum, carry_out);

    end

这让你更好地了解了出了什么问题。您将看到输出是z,这意味着您没有正确地连接东西。

同时,消除所有的警告信息。

票数 0
EN

Stack Overflow用户

发布于 2022-11-21 12:11:03

您需要密切关注您的模拟器日志文件,因为应该有警告消息,这将指出您的代码中的问题。例如,在EDA游乐场上,我看到了这样的警告:

代码语言:javascript
复制
Warning-[PCWM-W] Port connection width mismatch
testbench.sv, 21
"four_bit_adder adder(x, y, carry_in, sum, carry_out);"
  The following 1-bit expression is connected to 4-bit port "sum" of module 
  "four_bit_adder", instance "adder".
  Expression: sum
  Instantiated module defined at: "testbench.sv", 8

当您更改时,警告就会消失:

代码语言:javascript
复制
  wire sum;

至:

代码语言:javascript
复制
  wire [0:3] sum;

您可以使用wait,但是您应该考虑表达式不为真的情况。在这种情况下,您可以添加一个testbench超时,它在合理的时间之后干净地结束模拟。例如,在initial中添加第二个four_bit_adder_test

代码语言:javascript
复制
initial begin
    #50 $display("Error: timeout");
    $finish;
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74512333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档