Theoretically, if you can write software that is synthesized into machine code to run on a piece of hardware, that software can be synthesized into hardware. And conversely, there are hardware constructs in Verilog-1995 that are not considered synthesizable simply because none of the major vendors ever got around to supporting it (e.g.
assign
/
deassign
). We still have people using
//synopsis translate on/off
because it took so long for them to support
`ifdef SYNOPSYS
.
大多数我认为在SystemVerilog中可安全综合的内容都是我称之为Verilog语法糖的东西。这只是用更少的打字方式编写相同Verilog代码的更方便的方法。例如:
- 数据类型:typedef、struct、enum、int、byte
- 将这些类型用作端口、参数和函数返回值
- 赋值运算符:++ -- +=
- 类型转换和位流
- 包
- 接口
- 端口连接快捷方式
- 函数/任务/宏参数和端口连接的默认值
大多数属于这一类的构造都来自C语言,并不会真正改变代码的合成方式。只是更方便地定义和引用信号。
在动态分配存储的地方,合成就变得困难了。这将包括类对象、队列、动态数组和字符串,以及使用fork/join动态创建的进程。
我认为有些人对SystemVerilog存在误解,认为它只用于验证,而事实上标准的第一个版本是可合成子集,
Intel是最早将其作为设计语言使用的用户之一。
++
、--
或+=
,可能会导致竞争条件。例如,请参见 https://sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf。 - Hugh Perkins