为什么我的测试台不工作?

时间:2015-11-29 14:08:00

标签: verilog

我决定本周末开始和Verilog一起玩。我对此很陌生,并不完全明白我在做什么。我从PDF教程中复制了这个加法器代码。问题是该教程没有提供任何测试代码来运行它。我试着写自己的,但我得到的输出是zzzz。我想也许是在添加函数执行完毕之前尝试生成输出。

module addbit(a, b, ci, sum, co);
    input a, b, ci;
    output sum, co;
    wire a, b, ci, sum, co;
    assign {co, sum} = a + b + ci;
endmodule

module adder(result, carry, r1, r2, ci);
    input [3:0] r1;
    input [3:0] r2;
    input ci;
    output [3:0] result;
    output carry;
    wire [3:0] r1;
    wire [3:0] r2;
    wire ci;
    wire [3:0] result;
    wire carry;
    wire c1, c2, c3;
    addbit u0(r1[0], r2[0], ci, result[0], c1);
    addbit u1(r1[1], r2[1], c1, result[0], c2);
    addbit u2(r1[2], r2[2], c2, result[0], c3);
    addbit u3(r1[3], r2[3], c3, result[0], carry);
endmodule

module test();
    wire [3:0] a = 4'b1000;
    wire [3:0] b = 4'b0100;
    wire [3:0] result;
    wire carry = 0;
    wire ocarry;
    adder x(result, ocarry, a, b, carry);
    initial begin
        $display("%b", result);
    end
endmodule

1 个答案:

答案 0 :(得分:1)

  

我得到的输出是zzzz

您获得输出zzzz的原因来自您的加法器电路(请参阅下面的mcleod_ideafix评论)。

您可能希望将ab的输入类型更改为reg类型,以便您可以在程序块中分配它们并为它们分配不同的值。

module test();
    reg [3:0] a = 4'b1000;
    reg [3:0] b = 4'b0100;
    wire [3:0] result;
    wire carry = 0;
    wire ocarry;
    adder x(result, ocarry, a, b, carry);
    initial begin
      $display("@ %0dns a: %0d b: %0d result: %0d", $time, a, b, result);
      #1ns;
      a = 5;
      b = 6;
      $display("@ %0dns a: %0d b: %0d result: %0d", $time, a, b, result);
    end
endmodule

使用您发布的RTL和我上面修改过的测试平台,它将产生一个输出:

@ 0ns a: 8 b: 4 result: X
@ 1ns a: 5 b: 6 result: X

你的加法器对加法器电路没有预期效果。

为了帮助您,我为您创建了一个加法器电路。

module adder(result, carry, r1, r2, ci);
   input [3:0] r1;
   input [3:0] r2;
   input       ci;
   output [3:0] result;
   output       carry;

   assign {carry, result} = r1 + r2 + ci;
endmodule

一个工作测试平台将输入初始化为0然后循环10次。在循环内部,我们创建了1ns的延迟,并将输入更改为从015的随机值。

module test();
   reg [3:0] a;
   reg [3:0] b;
   wire [3:0] result;
   wire       carry = 0;
   wire       ocarry;

   adder x(result, ocarry, a, b, carry);

   initial begin
      $monitor("@%0dns [a: %0d] + [b: %0d] = [result: %0d] [carry = %0d] [ocarry = %0d] ", $time, a, b, result, carry, ocarry);
   end

   initial begin
      a = 0;
      b = 0;
      repeat (10) begin
         #1ns;
         a = $random % 'h10;
         b = $random % 'h10;
      end
   end
endmodule

您可以在edaplayground中运行此代码并查看输出。

对于abresultcarryocarry的每次更改,都会执行此代码。

$monitor("@%0dns [a: %0d] + [b: %0d] = [result: %0d] [carry = %0d] [ocarry = %0d] ", $time, a, b, result, carry, ocarry);