2

这应该产生 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
4

1 回答 1

3

阅读IEEE 1800-2012 第 11.5.1 节

可以使用应在自定上下文中评估的表达式来寻址该位。如果位选择地址无效超出范围或具有一个或多个 x 或 z 位),则引用返回的值应为 x 代表 4-state 和 0 代表 2-state values。标量或实变量或实参数的位选择或部分选择是非法的。

正如 LRM 中提到的,越界选择的结果应该是默认值。在您有两个状态变量(bit)的情况下,该值应归零

VCS 2017 迁移指南还修复了参数位选择的错误。我尝试了以下代码,并在最新的模拟器中找到了令人满意的结果:

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] b; // --> r2 = 00 b[3:2] = 00

注册 [1:0] r2; 位 [1:0] b; // --> r2 = 00 b[3:2] = 00。VCS 2014 有一个错误,它用 4 个状态值求解这个方程。

位 [1:0] r2; 注册 [1:0] b; // --> r2 = 00 b[3:2] = xx。这里 x 被优化为 bit 的默认值。

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

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

寻址完全超出向量、压缩数组、压缩结构、参数或串联的地址范围的位范围的部分选择,或者是 x 或 z 的部分选择应在读取时产生值 x和对写入时存储的数据没有影响。

上面的同样来自 LRM 的同一部分。

于 2018-07-13T14:04:53.940 回答