【问题标题】:Adding and Subtracting values in VerilogVerilog中的加减值
【发布时间】:2015-04-15 18:28:15
【问题描述】:

我正在编写一个充当现金存款箱的程序。 一切都发生在时钟边缘。 如果 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 中显示 Amount。它不显示值

我把我的测试台改成了这个 // 钱箱测试台

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 框中的金额

【问题讨论】:

  • 我在 tutorialspoint.com 上使用在线编译器

标签: variable-assignment verilog


【解决方案1】:

$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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多