构造do <blah> while (0)
是否可以在系统verilog中合成?
我问,因为我希望使用这种语法保护一些复杂的宏。
e.g。
`define my_macro(arg1) \
do \
my_reg <= arg1; \
valid <= 1; \
while (0)
或者是否有类似的verilog构造我可以使用。 Verilog是首选,因为它被更多工具使用。
答案 0 :(得分:2)
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
答案 1 :(得分:0)
只是想扩大我在回复中的评论中所说的内容:
开始和结束有什么问题? - 保罗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报告语法错误,因为我在该宏上添加了一个尾随分号,我很确定我做了很多。当然,我在规范中找不到它是否应该是语法错误,但我认为它被解释为空语句。
无论如何,我认为如果my_macro
是单个陈述,它应该包含其;
,这可能是一个很好的规则。然后单个语句和多语句宏以相同的方式工作。
答案 2 :(得分:0)
不,不......更好用开始....结束
答案 3 :(得分:0)
@dave,你可以试试这个:
`define my_macro(arg1) \
if (1) \
my_reg <= arg1; \
valid <= 1; \
else
在使用'if ... else'的任何语言中使用'do ... while'都不会效率低,所以前者是首选。 Here is a link到C ++ FAQ-lite,说明了类似的结构。同样使用'if ... else'使它成为Verilog-1995而不是SystemVerilog构造。
BTW @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希望宏的用户不要有';'最后?