系统verilog结构是可合成的吗?

系统verilog结构是可合成的吗?,verilog,fpga,system-verilog,synthesis,Verilog,Fpga,System Verilog,Synthesis,构造do while(0)是否可在系统verilog中合成 我这样问是因为我有一些复杂的宏,我希望使用这种语法来保护它们 e、 g `define my_宏(arg1)\ 做\ my_regSystemVerilog中的循环构造,例如for、while、do…while、repeat,可以在现代逻辑合成器中合成,只要条件表达式可以在精化(或编译时)期间展开和计算。这对该工具来说不是问题,因为该工具仅采用编译器中的循环展开技术。通过这种方式,必须在编译期间计算条件表达式(意味着不能在运行时动态更改

构造
do while(0)
是否可在系统verilog中合成

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

e、 g

`define my_宏(arg1)\
做\

my_regSystemVerilog中的循环构造,例如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
(i=0;i<10;i=i+1)的

对于(i=0;i5)中断;//`如果循环失败,则还支持“继续”和“中断”
//遵循可综合的规则。
...
结束

我只是想进一步阐述一下我在回复中所说的:

“开始”和“结束”有什么问题保罗昨天去世了

@保罗:因为那时我的宏(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报告语法错误,因为我在那个宏上加了一个尾随分号,我很确定我经常这样做。当然,我在规范中找不到它是否应该是语法错误,但我认为它会被解释为null语句


不管怎样,我认为如果
my_macro
是一个单独的语句,那么它应该包含它的
,这可能是一个很好的规则。那么单语句宏和多语句宏的工作方式是相同的。

不,它不是….最好使用begin….end

@dave,您可以尝试以下方法:

`define my_macro(arg1) \
  if (1) \
    my_reg <= arg1; \
    valid <= 1; \
  else

我不知道为什么UVM选择这样做,而不是遵循SW世界多年来的做法。。。使用“do…while()”或“if…else”允许宏用户输入分号。可能与C/C++不同,在Verilog/SV中,由于“`”,宏与任务明显不同,因此UVM希望宏的用户没有“;”最后?

您想解决什么高级问题?这里似乎不需要循环。我有一个可能有用的循环。
begin
end
有什么问题?@PaulS:因为我的_宏(1);扩展到开始到结束;后面的分号是一个语法错误。调用我的宏的人如何知道它是单语句还是多语句?(或者它甚至可能会改变…)@dave:但这正是UVM库所做的,而且我从来没有在宏的末尾错误地放置分号的问题。在放置“;”时可能会出现语法错误在宏之后,在类似这样的代码中
if(foo)
`
uvm\u info(get\u type\u name(),“foo”,uvm\u DEBUG);else
`
uvm\u信息(获取类型名称(),“非foo”,uvm\u调试)我很确定这在不同的模拟器中是不同的,正如我所说的,我在SV规范中找不到任何关于它是否应该导致错误的东西。从IEEE SV标准附录A的形式语法:
seq_block:=
begin
[
块标识符]{block_项声明}{statement_或{null}
end
[
block\u identifier]
语句\u或\u null::=语句{attribute\u instance}
<代码>语句::=[block_identifier
]{attribute_instance}statement_item
语句_item::=…|seq_block |…
conditional_语句::=
if
(cond_谓词)语句_或_null[
else
语句_或_null]|如果_语句
so
if(…)开始时唯一的_优先级_。。。结束;否则…
不是标准SV。
`define my_macro(arg1) \
  if (1) \
    my_reg <= arg1; \
    valid <= 1; \
  else
if (foo)
  `uvm_info (get_type_name(), "foo", UVM_DEBUG);
else
  `uvm_info (get_type_name(), "not foo", UVM_DEBUG);