关于fpga:systemverilog构造可同时合成吗?

Is the system verilog constuct do-while synthesizable?

构造体do <blah> while (0)是否可以在系统Verilog中合成?

我问是因为我有一些希望使用此语法保护的复杂宏。

例如

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);扩展到开始结束;并且结尾的分号是语法错误。调用我的宏的人又如何知道它是单条语句还是多条语句? (或者甚至可能会更改...)–昨天戴夫

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是单个语句应该包含其;可能是一个好规则。然后,单语句宏和多语句宏以相同的方式工作。