verilog中的Slice隐式总线

verilog中的Slice隐式总线,verilog,xilinx,Verilog,Xilinx,我正在使用Xilinx ISim(ISE) 我有以下声明: assign dwToAlign = {first_aligned >> 3}[7:0] - {i_address >> 3}[7:0]; 当我尝试进行行为模拟时,它会抛出一个内部编译器错误。如果我对这一行进行注释,它将正确编译。我确信昨天编译的代码完全相同(我将其提交给我的git回购) 如果我进行合成,然后进行pnr后模拟,代码会正确地进行合成和模拟 这是有效的verilog吗 编辑:文件上的代码否无效。您

我正在使用Xilinx ISim(ISE)

我有以下声明:

assign dwToAlign = {first_aligned >> 3}[7:0]  - {i_address >> 3}[7:0];
当我尝试进行行为模拟时,它会抛出一个内部编译器错误。如果我对这一行进行注释,它将正确编译。我确信昨天编译的代码完全相同(我将其提交给我的git回购)

如果我进行合成,然后进行pnr后模拟,代码会正确地进行合成和模拟

这是有效的verilog吗


编辑:文件上的代码

否无效。您的示例使用了
{}
串联运算符,我认为您应该只使用括号
()

如果需要使用零件选择,则首先声明移位。这是所有的组合逻辑,将导致相同的硬件

assign temp1     = (first_aligned >> 3);
assign temp2     = (i_address >> 3);
assign dwToAlign = temp1[7:0]  - temp2[7:0];
值得注意的是,如果使用零件选择,即使指定了完整范围,也将忽略有符号的算法

即,如果在访问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];

谢谢你的回答。它合成正常,这就是为什么我问这个问题。我最后把本来会移位的部分切掉。分配dwToAlign=第一个对齐的[10:3]-i\U地址[10:3]。非常感谢。