这应该产生 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
这应该产生 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
可以使用应在自定上下文中评估的表达式来寻址该位。如果位选择地址无效 (超出范围或具有一个或多个 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 的同一部分。