在Verilog中添加和减去值

时间:2015-04-15 18:28:15

标签: variable-assignment verilog

我正在编写一个充当现金存款箱的程序。 一切都发生在时钟边缘。 如果enable为true且reset为true,则框中的值将重置为0。 如果enable为true且add为1,我们将金额添加到框中。 如果enable为true且add为0,则从框中减去。

这是我的代码和测试平台

module cashbox(output [15:0] value, input [15:0] amount, input add,enable, clock, reset);
reg value;

 always @(posedge clock)
 begin
if(enable) begin
  if(reset)begin
    value <= 0;
    end
  else begin
    if(add)begin
     value <= value + amount;
     end
    else begin
      value <= value - amount;
      end
    end

end    

end
endmodule

// cashbox testbench

module cashbox_tb;
reg [15:0] amt;
reg add, en, clk, rst;
wire [15:0] value;

cashbox cb(value, amt, add, en, clk, rst);

always
    #50 clk = ~clk;

initial begin
    $display("Amount in box %d", value);
    clk = 1; en = 1; add = 1;
    rst = 1; #10 rst = 0;
     amt = 100; add = 1;
    #170 en = 1; #100 en = 0;  // 90
    #20 amt = 50; add = 0;
    #180 en = 1; #100 en = 0;  // 290
    #20 amt = 75; add = 1;
    #180 en = 1; #100 en = 0;  // 490
    #20 amt = 35; add = 0;
    #180 en = 1; #100 en = 0;  // 690
    #20 amt = 50; add = 0;
    #180 en = 1; #100 en = 0;
    #810 $finish;
end
endmodule

所有内容都会编译,但是当我运行它时,它会在框X中显示数量。它没有显示值

我改变了我的测试台      //钱箱测试台

module cashbox_tb;
reg [15:0] amt;
reg add, en, clk, rst;
wire [15:0] value;

cashbox cb(value, amt, add, en, clk, rst);

always
    #50 clk = ~clk;

initial begin
   $monitor("Amount in box %d",value);
    clk = 0; en = 0; add = 0;
    rst = 1; #10 rst = 0;
    #10 amt = 100; add = 1;
    #170 en = 1; #100 en = 0;  // 90
    #20 amt = 50; add = 0;
    #180 en = 1; #100 en = 0;  // 290
    #20 amt = 75; add = 1;
    #180 en = 1; #100 en = 0;  // 490
    #20 amt = 35; add = 0;
    #180 en = 1; #100 en = 0;  // 690
    #20 amt = 50; add = 0;
    #180 en = 1; #100 en = 0;
    #810 $finish;
end

endmodule

现在我的输出又回到了X框中的金额

1 个答案:

答案 0 :(得分:2)

$display仅在时间0执行。将其更改为$monitor,以便每次value更改时都会显示消息:

$monitor("Amount in box %d", value);

以下是我使用VCS获得的输出:

Amount in box     0
Amount in box     1
Amount in box     0

请参阅IEEE Std 1800-2012,“21.2.3连续监测”部分。

我收到VCS的编译警告,我收到了Incisive的编译错误。

可以通过更改以下内容来清理:

module cashbox(output [15:0] value, input [15:0] amount, input add,enable, clock, reset);
reg value;

为:

module cashbox(output reg [15:0] value, input [15:0] amount, input add,enable, clock, reset);

在更改之后,这是我的输出:

Amount in box     0
Amount in box   100
Amount in box   200
Amount in box   150
Amount in box   225
Amount in box   190
Amount in box   140