【问题标题】:Verilog circular registers, how do they work?Verilog 循环寄存器,它们是如何工作的?
【发布时间】:2014-02-04 02:20:13
【问题描述】:

关于循环寄存器的问题:

代码:

reg [7:0] value1;

reg [7:0] value2;

value1 = 50;

value2 = value1 - 255;

问题:

value2=0 还是 value2=205 ??

【问题讨论】:

    标签: verilog


    【解决方案1】:

    这取决于...

    reg [7:0] value1;
    reg [7:0] value2;
    
    always @* begin
      value1 = 50;
      value2 = value1 - 255;
    end
    

    value2 将是 205。第二个阻塞赋值发生在第一个阻塞赋值之后,因此当 value2 被赋值时,value1 已经有一个已知值 (50)。

    reg [7:0] value1;
    reg [7:0] value2;
    
    always @(posedge clk) begin
      value1 <= 50;
      value2 <= value1 - 255;
    end
    

    value2 在第二个 clk 上升沿后为 205。这两个任务都是非阻塞的。在第一个上升沿之后(第一次评估alwaysvalue1 为50,而value2 未确定,因为它与value1 同时分配,而当时value1 有还不是一个已知的值。

    在第二个时钟上升沿之后,value1 不会改变(再次分配为 50),value2 得到 205,因为它是使用之前的值 value1 评估的,已经是 50。

    【讨论】:

      【解决方案2】:

      既不是 0,也不是 205,而是 51!

      value1 和 value2 都是无符号的,因此结果也应该是无符号的:

      值1 = 00110010,-255 = (11111111111111111111111100000001)_base2,值2 = (00110011)_base2 = (51)_base10

      这里是my test module

      module test;
       reg [7:0]  value1;
       reg [7:0]  value2;
      
      
      initial begin
        value1 = 50;
        value2 = value1 - 255;
        $display ("Value1 = %b, -255 = (%b)_base2, value2 = (%b)_base2 = (%d)_base10", value1, -255, value2, value2);
      end
      endmodule
      

      【讨论】:

      • logic 不是 Verilog 支持的数据类型。此问题尚未被Systemverilog 标记。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2013-06-30
      • 2022-10-01
      相关资源
      最近更新 更多