系统verilog构造是否可以合成?

时间:2012-11-04 08:38:29

标签: verilog fpga system-verilog synthesis

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

我问,因为我希望使用这种语法保护一些复杂的宏。

e.g。

`define my_macro(arg1) \
    do \
         my_reg <= arg1; \
         valid <= 1; \
    while (0)

或者是否有类似的verilog构造我可以使用。 Verilog是首选,因为它被更多工具使用。

4 个答案:

答案 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希望宏的用户不要有';'最后?