1

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

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

例如

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

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

4

4 回答 4

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
于 2012-11-05T13:23:02.377 回答
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 报告语法错误,因为我在那个宏上放了一个尾随分号,而且我很确定我经常这样做。当然,我在规范中找不到它是否应该是语法错误,但我认为它被解释为空语句。

无论如何,我认为说 ifmy_macro是一个单独的语句它应该包含它的;. 然后单语句和多语句宏以相同的方式工作。

于 2012-11-09T13:21:59.297 回答
0

不,它不是......更好地使用开始......结束

于 2012-11-23T05:46:24.027 回答
0

@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 期望宏的用户没有“;” 在末尾?

于 2013-05-01T22:28:49.057 回答