module dut ( a,b_out,array,c);
input [2:0] a;
input [3:0] array;
input c;
output reg b_out;
always@( a or c or array) begin
if(c)
b_out = 1'b0;
else
b_out = array[a];
end
endmodule
上述RTL中可能存在范围溢出,它如何影响模拟和合成?
答案 0 :(得分:3)
当a > 3
和!c
然后b_out
在模拟中为undef时,因为对向量的越界访问会返回undef(即1'bx
)。参见IEEE Std 1364-2005中的5.2.1:
任何类型的部分选择,用于处理一系列位 完全超出了net,reg,integer,time的地址范围 变量,或参数或部分选择是x或z应产生 读取时的值x,对存储的数据没有影响 书面。当部分选择部分超出范围时 读取,返回x表示超出范围的位,并且何时 写入,只影响范围内的位。
在综合中,这种不关心的东西将被转化为综合工具认为最有效的东西。很可能这意味着a
中仅使用array[a]
的底部两位,即它与array[a[1:0]]
相同。但是无法保证这一点,并且创建一个例如在a[2]
为高时始终返回1或0的电路同样正确。