在整个非阻塞赋值之外使用圆括号有何作用?

What do the round braces do when used outside the whole non-blocking assignment?

这段代码中的圆括号在 Verilog 中的作用是什么?

rx_wb_valid <= (wb_memaddr <= { rx_len[(10+1):2] });

rx_wb_valid是1位寄存器

wb_memaddr是10位寄存器

rx_len是12位寄存器

括号 () 在您的代码行中是可选的。没有它们,您的代码应该表现相同。但是,我认为它们使您的代码更具可读性,因为它们清楚地将左 <= 运算符(非阻塞赋值)与右 <= 运算符(比较)分开。

花括号 {} 在那里也是可选的。我认为在这种情况下最好删除它们。

您确实需要展示比您所写内容更多的上下文。如果你有语句:

begin
  some_var <= rx_wb_valid <= (wb_memaddr <= { rx_len[(10+1):2] });
end

圆括号更改了默认的从左到右的优先级规则,这将被解释为

begin
  some_var <= (rx_wb_valid <= wb_memaddr) <= { rx_len[(10+1):2] };
end

编译器在语句的开头看到第一个变量名后跟赋值运算符(=、<=),它知道后面必须是一个表达式。在 Verilog 的表达式中不允许使用赋值运算符(SystemVerilog 确实允许某些情况)。在表达式中,圆括号 () 用于更改默认优先级,但也可以像您的示例一样用于清晰度。

花括号 {} 是连接运算符。通常一个连接有多个操作数,但有一种特殊用途只有一个操作数。由于串联的每个操作数都是自行确定的,因此您可以在应用操作之前使用它来防止扩展。例如,如果您有以下内容:

rx_wb_valid <= wb_memaddr <= ~rx_len[3:2];

由于 wb_memaddr 是一个 10 位变量,它将通过在 之前用 0 填充 8 位来扩展 rx_len[3:2],然后 否定 10 位。那些填充位将变为 1。但是通过写作:

rx_wb_valid <= wb_memaddr <= {~rx_len[3:2]};

它会在填充 8 位之前取反 rx_len[3:2] 的 2 位,留下这些位 0。