我可以将2个状态超出范围的访问位分配给4个状态变量吗?

时间:2018-07-13 07:02:29

标签: system-verilog iverilog

这应该产生x或0,因此结果完全是x还是0?累积如果访问2个状态变量超出范围,则将其赋给LRM,则它应该为0。将0赋给r2是否正确。

module top;
    reg [1:0] r;
    bit [1:0] b;

    assign  r2= b[2:1] + b[3:2]; 
    initial begin
       $monitor(r2);
    end
endmodule

1 个答案:

答案 0 :(得分:3)

IEEE 1800-2012 Section 11.5.1中读取内容:

  

可以使用将要求值的表达式来寻址该位   在一个自定的上下文中。 如果位选择地址无效   (超出范围或具有一个或多个x或z位),然后   参考返回的值对于4态应为x,对于4态应为0   2状态值。标量或标量的位选择或部分选择   实变量或实参数,应该是非法的。

如LRM中所述,越界选择的结果应为默认值。对于两种状态变量(),该值应清零

VCS 2017 migration guide还针对参数位选择进行了错误修复。我尝试了以下代码,并使用最新的模拟器找到了令人满意的结果:

module top;
    reg [1:0] r2;
    bit [1:0] b;

    assign  r2= b[2:1] + b[3:2]; 
    initial begin
      b = 1;
      #1;
      $display("r2 = %b b[3:2] = %b", r2,b[3:2]);
    end

endmodule

请注意,该示例在不同版本的模拟器上运行。其他模拟器的行为可能有所不同。

  

输出VCS 2017

     

位[1:0] r2; [1:0]位; //-> r2 = 00 b [3:2] = 00

     

reg [1:0] r2; [1:0]位; //-> r2 = 00 b [3:2] =00。VCS2014出现一个bug,正在用4个状态值求解此方程。

     

位[1:0] r2; reg [1:0] b; //-> r2 = 00 b [3:2] = xx。在此,x被优化为默认值bit。

     

reg [1:0] r2; reg [1:0] b; //-> r2 = xx b [3:2] = xx

请注意,当我们将部分选择本身用作“ x”时,总是期望结果为“ x”。

  

部分选择可解决完全超出范围的位   向量的地址范围,压缩数组,压缩结构   参数或串联,或部分选择即x或z   读取时得出x值,并且对数据没有影响   写入时存储。

以上内容也是来自LRM的同一部分。