Is the system verilog constuct do-while synthesizable?
构造体
我问是因为我有一些希望使用此语法保护的复杂宏。
例如
1 2 3 4 5 | `define my_macro(arg1) \\ do \\ my_reg <= arg1; \\ valid <= 1; \\ while (0) |
或者我可以使用类似的verilog构造。最好使用Verilog,因为它会被更多的工具使用。
SystemVerilog中的循环构造(例如for,while,do ... while,repeat)可以在现代逻辑合成器中进行合成,只要且仅当条件表达式可以在详细说明(或编译时)中展开和计算时才可以。这对于该工具不是问题,因为该工具仅采用了编译器的循环展开技术。通过这种方式,必须在编译期间计算条件表达式(意味着在运行时不能动态更改),以确定循环的终止条件是什么。
有时即使循环具有终止条件,但该工具可能会有一些限制,以限制循环展开不超过阈值(例如1k或10k),以防止在展开和展开循环主体时浪费大量时间(工具不知道限制,它只是继续尝试并测试终止条件)
在下面的示例中,可以合成循环。
1 2 3 4 5 6 7 8 9 | 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 |
@dave,您可以尝试以下操作:
1 2 3 4 5 | `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,在输入';'时可能会出现语法错误。在宏之后,在这样的代码中:
1 2 3 4 | 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希望宏的用户不具有";"。到底是什么?
没有它。...更好地使用开始。...结束
只是想扩展我在回复此评论时所说的内容:
What's wrong with begin and end? – Paul S yesterday
@PaulS:因为是my_macro(1);扩展到开始结束;并且结尾的分号是语法错误。调用我的宏的人又如何知道它是单条语句还是多条语句? (或者甚至可能会更改...)–昨天戴夫
blockquote>
UVM库广泛使用以下惯用法:
1
2
3
4
5 `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报告语法错误,因为我在该宏上加上了分号,而且我敢肯定我已经做了很多。当然,我无法在规范中找到它是否应该是语法错误,但我认为它会被解释为空语句。
无论如何,我认为说
my_macro 是单个语句应该包含其; 可能是一个好规则。然后,单语句宏和多语句宏以相同的方式工作。