我正在使用Xilinx ISim(ISE)
我有以下分配声明:
assign dwToAlign = {first_aligned >> 3}[7:0] - {i_address >> 3}[7:0];
当我尝试进行行为模拟时,会抛出内部编译器错误。如果我评论这个特定的行,它会正确编译。我确信昨天编译完全相同的代码(我将它提交给我的git repo)。
如果我合成然后进行后pnr模拟,代码会合成并模拟正确。
这是有效的verilog吗?
编辑:EDAPlayground上的代码http://www.edaplayground.com/x/3wW
答案 0 :(得分:1)
不,它无效。您的示例使用{}
连接运算符,我认为您应该使用括号()
。
如果您需要使用部件选择,则先声明轮班。它是所有组合逻辑,将产生相同的硬件。
assign temp1 = (first_aligned >> 3);
assign temp2 = (i_address >> 3);
assign dwToAlign = temp1[7:0] - temp2[7:0];
值得注意的是,如果使用了部分选择,即使指定了整个范围,也会忽略signed
算术。
即如果访问temp1 [7:0]时temp1和temp2被声明为wire signed [7:0] temp1
,则忽略signed属性。如果需要,您可以使用$signed( temp1[7:0] )
强制它。如果您需要保留签名信息,则可以使用签名班次(>>>
)作为签名数据类型。
OP还在评论中留下了他们的案例,他们也可以使用:
assign dwToAlign = first_aligned[10:3] - i_address[10:3];