SystemVerilog 前端 slang 编译器发布 v6.0 release 版本

亮点

v6.0 release 添加了对 SystemVerilog configuration 特性的支持,这个是 slang 中缺失的最后一块主要的语言特性拼图。在能宣布 slang 支持 SystemVerilog 达到 100% 完全完成的程度前 – 有关已知问题,可以查看 lang-compliance 标签。
此外,这个版本开始添加对新发布的 SystemVerilog LRM 的 IEEE 1800-2023 版本中的更改的支持。这方面的工作将会在下一个 slang release 版本完成。这个版本中所有的改动可以分为两类:

  1. 阐明(clarifications):自动应用于所有 code 的改动。
  2. 新特性(New features):需要使用新的 --std 命令行参数来启动的。

语法支持

  • 添加了 --allow-bare-value-param-assigment (包含在 "vcs "兼容模式中),以允许使用非标准模块实例化语法,在这种语法中,可以提供单个参数值而不包含括号。
  • 添加了 --allow-self-determined-stream-concat (包含在 "vcs "兼容模式中),以允许在自定上下文中(而不仅仅是在赋值中)使用流连接表达式(streaming concatenation expressions)。
  • 添加了 --allow-multi-driven-locals (包含在 "vcs "兼容模式中),以允许子程序局部变量可以由多个 always_ff / always_comb 块驱动
  • 已添加对 SystemVerilog libraries 和 configurations 的全面支持
  • 已添加对虚拟接口和实际接口实例之间相等比较的支持(感谢 @likeamahoney
  • 在 fork-join_any 和 join_none 块中现在已正确禁止 Ref args。
  • wildcard 通配符端口连接现在可正确避免通过通配符导入将新符号导入作用域
  • 已添加对涉及 virtual interface 数组的 unpacked 数组连接中的 referencing interface 实例的支持

IEEE 1800-2023 说明

  • Unsized 整数字面量可以是任何位宽,而不仅仅只是 32 位上限
  • Unpacked 集合允许作为 net types
  • 时间字面量应按比例缩放,但不能四舍五入到当前时间精度
  • 允许在宏定义中使用多行块注释
  • 集合成员(Set membership)运算(case 语句、inside 运算符)始终允许使用 unbounded 字面量
  • Unbounded 字面量只能分配给具有 simple bit vector 类型的参数
  • $cast 的参数不需要是单数(singular)的
  • 检测从 always_comb/_latch/_ff 调用的子例程中的多驱动变量不适用于 tasks,仅适用于 functions
  • 不允许对动态数组的元素进行非阻塞赋值
  • Static casts 是类似赋值的上下文
  • Tagged union 表达式必须是主表达式(binary 表达式是不允许的)
  • 高危系统任务应在常量函数中运行(且表现为 elaboration-time tasks)

IEEE 1800-2023 新特性

  • 三重引号(Triple quoted)(多行)字符串字面量
  • 使用三重引号字符串的宏字符串化(Macro stringification)
  • Type 参数和 type() 操作符现在可以引用不完整的正向 typedefs
  • Type 参数现在可以像正向类型定义一样指定类型限制
  • Design 元素内不允许使用 `timescale 指令
  • 条件指令(Conditional directives)中的布尔表达式(ifdef、ifndef)函数调用表达式可进行链式处理(slang 已支持该功能,与之相关的几个问题已得到修复)
  • 现在允许在类声明中的静态上下文中使用 type(this)
  • Soft packed union 支持
  • 数组迭代器的索引方法可通过方法调用的参数重命名
  • Unpacked 数组有了内置的 map 方法
  • 类 Class 可以声明为 final
  • 类构造函数参数列表和扩展参数列表可声明为默认值
  • 类方法可以被声明为初始、扩展和最终方法
  • 添加了 weak_reference 内置类
  • 可在其他类中声明接口 Interface 类
  • 内置进程 Process 类已声明为 Final 类
  • 值范围获得了新的绝对/相对公差运算符
  • ref 静态子程序参数

General Features

  • 添加了 -Wmultibit-edge(默认开启),以对多位表达式(Multibit expression)的时钟边沿触发发出警告
  • 添加了 -Wint-bool-conv 和 -Wfloat-bool-conv,以对布尔上下文中使用的多位整数和浮点表达式发出警告。
  • 添加了 -Wuseless-cast 来警告与底层表达式相同类型的显式转换
  • 添加了 -Wunknown-sys-name 以降级引用未知系统任务或函数时出现的错误。
  • 添加了编译单元列表,允许对如何将源代码解析为单独的编译单元进行细粒度控制(包括按单元分离宏定义和包含目录)
  • 添加了 --defaultLibName 以控制默认源码库的名称
  • 添加了 --std 用于选择应符合哪个版本的 LRM slang。默认为 “1800-2017”,但也可设置为 “1800-2023”,以启用最近发布的 SystemVerilog LRM 更新中添加的新功能。
  • 添加了一个新的实验工具 slang-hier,可打印设计中的详细实例(感谢 @udif

Improvements

  • 现在,–cmd-ignore 和 --cmd-rename 也可用于通过等式表达式包含值的选项
    有关模块/接口/程序定义的信息现在包含在 AST JSON 输出中了
  • 改进了 slang-reflect,以支持为本地参数反映更复杂的类型(感谢 @Sustrak
  • 重写了用户自定义基元表的分析,使其效率大大提高;以前分析具有大量输入的基元可能需要很长时间
  • 命令行定义现在优先于 Verilog 源文件中的定义,这与其他工具的行为一致(感谢 @udif
  • 改进了 -Wvector-overflow 功能,在形成最小负整数字面时不会发出警告
  • 命令文件行尾的反斜线现在会被忽略,而不会导致错误(感谢 @udif

本次更新为我们带来了 2023 LRM 的支持,可以通过 --std 来指定 slang 目前所使用的 LRM standard。原始更新日志,请查阅:slang v6.0 release

推送的 Fixes 内容请自行查阅原始更新日志 :smiley: