系统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]|如果_语句
soif(…)开始时唯一的_优先级_。。。结束;否则…
不是标准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);