在整个非阻塞赋值之外使用圆括号有何作用?
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。
这段代码中的圆括号在 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。