在verilog中切片隐式总线

时间:2014-07-08 08:42:43

标签: verilog xilinx

我正在使用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

1 个答案:

答案 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];