合成中应避免哪些SystemVerilog功能?

合成中应避免哪些SystemVerilog功能?,verilog,system-verilog,Verilog,System Verilog,SystemVerilog引入了一些非常有用的结构来改进编码风格。然而,正如我的一位同事经常说的,“你不是在写软件,你是在描述硬件。”考虑到这一点,当需要综合最终结果时,应该避免语言的哪些特性?这显示了Synopsys工具目前可以合成的功能,但为了安全起见,我认为应该只使用所有主要供应商都可以合成的功能。此外,什么构造会在网络列表中产生奇怪的结果,这在ECO中很难遵循 总之:我喜欢紧凑且易于维护的代码,但如果它在后端导致问题,我就不喜欢。我应该避免什么 编辑:作为对投票结果的回应,我想试着让这更

SystemVerilog引入了一些非常有用的结构来改进编码风格。然而,正如我的一位同事经常说的,“你不是在写软件,你是在描述硬件。”考虑到这一点,当需要综合最终结果时,应该避免语言的哪些特性?这显示了Synopsys工具目前可以合成的功能,但为了安全起见,我认为应该只使用所有主要供应商都可以合成的功能。此外,什么构造会在网络列表中产生奇怪的结果,这在ECO中很难遵循

总之:我喜欢紧凑且易于维护的代码,但如果它在后端导致问题,我就不喜欢。我应该避免什么


编辑:作为对投票结果的回应,我想试着让这更具体一点。这个问题的灵感来自于答案。我非常喜欢使用Dave所说的“sugar”来降低代码复杂度,但如果某些合成工具会破坏信号名称并使结果难以处理,我就不会这样做。我在寻找更多这样的例子。

理论上,如果你可以编写合成成机器代码的软件在一块硬件上运行,那么软件可以合成成硬件。相反,Verilog-1995中有一些硬件结构被认为是不可合成的,这仅仅是因为没有一家主要的供应商能够支持它(例如,
assign
/
deassign
)。我们仍然有人使用
//synopsis translate on/off
,因为他们花了很长时间才支持
`ifdef synopsis

SystemVerilog中合成的大部分我认为是“强>安全/强”是我称之为Verilog的语法糖。这只是用更少的输入编写相同的Verilog代码的更方便的方法。例如:

  • 数据类型:typedef、struct、enum、int、byte
  • 将这些类型用作端口、参数和函数返回值
  • 赋值运算符:++--+=
  • 类型铸造和钻头流化
  • 包裹
  • 接口
  • 端口连接快捷方式
  • 函数/任务/宏参数和端口连接的默认值
属于这一类的大多数结构都是从C语言中提取的,并不会真正改变代码的合成方式。定义和参考信号更方便

难以综合的地方是动态分配存储的地方。这将是类对象、队列、动态数组和字符串。以及使用fork/join动态创建的流程

我认为有些人对SystemVerilog有一种误解,认为它只是用于验证,而事实上,该标准的第一个版本是可合成的子集,是它作为设计语言的首批用户之一。

SystemVerilog(SV)可以同时用作HDL(硬件描述语言)和HVL(硬件验证语言),这就是为什么它通常被称为“HDVL”

SV中有几个有趣的设计结构,它们是可合成的,可以用来代替旧的Verilog结构,这有助于优化代码并获得更快的结果

  • 建模FSM时SV的
    枚举
    与Verilog的
    参数
  • 使用
    逻辑
    代替
    reg
    wire
  • 使用
    始终锁定
    始终锁定
    始终锁定
    代替 Verilog中的单个
    始终
  • 使用
    unique
    priority
    语句代替Verilog
    完整
    并行
    案例陈述
  • SV中提供多种数据类型
  • 现在我在上面讨论的是那些在RTL设计中使用的SystemVerilog结构

    但是,验证环境中使用的构造是不可合成的。它们如下所示:

  • 动态数组和关联数组
  • 程序块和时钟块
  • 信箱
  • 信号量
  • 类及其所有相关功能
  • 任务
  • 钱德尔数据类型
  • 排队
  • 受约束的随机特征
  • 延迟、等待和事件控制语句