这应该产生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
答案 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的同一部分。