该构造是否可do <blah> while (0)
在系统 verilog 中综合?
我问是因为我有一些复杂的宏,我希望使用这种语法来保护它们。
例如
`define my_macro(arg1) \
do \
my_reg <= arg1; \
valid <= 1; \
while (0)
或者我可以使用类似的verilog构造。Verilog 将是首选,因为它被更多工具使用。
该构造是否可do <blah> while (0)
在系统 verilog 中综合?
我问是因为我有一些复杂的宏,我希望使用这种语法来保护它们。
例如
`define my_macro(arg1) \
do \
my_reg <= arg1; \
valid <= 1; \
while (0)
或者我可以使用类似的verilog构造。Verilog 将是首选,因为它被更多工具使用。
SystemVerilog 中的循环结构,例如 for、while、do...while、repeat,可以在现代逻辑合成器中合成当且仅当条件表达式可以在精化(或编译时间)期间展开和计算。这对工具来说不是问题,因为该工具只是使用了来自编译器的循环展开技术。通过这种方式,必须在编译期间计算条件表达式(意味着不能在运行时动态更改)以确定循环的终止条件是什么。
有时即使循环有终止条件,但工具可能有一些限制,限制循环展开不超过阈值,例如 1k 或 10k,以防止在展开和展开循环体上浪费太多时间(工具不知道限制,它只是不断尝试和测试终止条件)
在以下示例中,可以合成循环。
for (i=0; i < 10; i=i+1)
for (i=0; i < WIDTH; i=i+1) // if WIDTH is a constant, or a parameter
for (i=0; i < 10; i=i+1) begin
...
if (i > 5) break; // `continue' and `break' are also supported if the loop
// follows the synthesizable rules.
...
end
只是想扩展我在回复此评论时所说的话:
开始和结束有什么问题?– 保罗 S 昨天
@PaulS:因为那时 my_macro(1); 展开到开始结束;后面的分号是语法错误。调用我的宏的人如何知道它是单语句还是多语句?(或者它甚至可能改变......) - 戴夫昨天
UVM 库广泛使用以下习语:
`define uvm_info(ID,MSG,VERBOSITY) \
begin \
if (uvm_report_enabled(VERBOSITY,UVM_INFO,ID)) \
uvm_report_info (ID, MSG, VERBOSITY, `uvm_file, `uvm_line); \
end
我从来没有让 IES 报告语法错误,因为我在那个宏上放了一个尾随分号,而且我很确定我经常这样做。当然,我在规范中找不到它是否应该是语法错误,但我认为它被解释为空语句。
无论如何,我认为说 ifmy_macro
是一个单独的语句它应该包含它的;
. 然后单语句和多语句宏以相同的方式工作。
不,它不是......更好地使用开始......结束
@dave,你可以试试这个:
`define my_macro(arg1) \
if (1) \
my_reg <= arg1; \
valid <= 1; \
else
在任何语言中,使用 'if...else' 不会比使用 'do...while' 更加低效,因此首选前者。这是C++ FAQ-lite 的链接,说明了类似的结构。还使用“if...else”使其成为 Verilog-1995,而不是 SystemVerilog 构造。
顺便说一句@Paul S,放置';'时会出现语法错误 在宏之后,在这样的代码中:
if (foo)
`uvm_info (get_type_name(), "foo", UVM_DEBUG);
else
`uvm_info (get_type_name(), "not foo", UVM_DEBUG);
我不确定为什么 UVM 选择这样做而不是遵循 SW 世界多年来所做的事情......使用'do...while()'或'if...else'来允许宏用户放置那个分号。可能与 C/C++ 不同,在 Verilog/SV 中,由于“`”,宏与任务明显不同,因此 UVM 期望宏的用户没有“;” 在末尾?