Yosys read_verilog -sv 不支持的语法:package/import 报错排查
更新时间:2026-10-30。FAQ 速查页,属于 EDA 报错排查系列。Yosys read_verilog -sv 不支持的语法经常只表现为一句普通的
syntax error,容易让人误以为括号或分号写错。本篇用 Yosys 0.33 实测 SystemVerilog 的package+import:源码在第 6 行通配导入处停止,退出码为 1;把包常量改成模块参数后,hierarchy、proc、check全部通过。文件路径类问题则看 Yosys read_verilog include 文件找不到。
首屏答案:read_verilog -sv 的作用是打开 Yosys 已实现的 SystemVerilog 子集,不是接入一个完整 SystemVerilog 前端。遇到标准语法仍报 unexpected TOK_ID 时,先把构造缩到最小,再判断是源码拼写错误还是当前版本的能力边界。本篇命中的边界是 package/import,最稳的综合侧修法是把共享常量下沉为模块参数;不要通过反复调整分号来碰运气。
下面三栏把同一条数据通路的三种状态放在一起:左栏是标准 SystemVerilog 写法,中栏是本版 Yosys 的实际诊断,右栏是经过复跑验证的改写。中间退出码 1 与右侧退出码 0 来自同一次连续运行。
读这张图不要得出“SystemVerilog 语法有错”的结论:它比较的是语言标准允许什么与这个综合前端接受什么。改写没有更改默认位宽和组合逻辑,只改变常量的作用域表达方式,因此适合作为原用例的可信对照。
本文要回答的问题
- 这次
read_verilog -sv的完整报错定位在哪一行,退出码是多少? - 为什么
-sv已经加上,标准 SystemVerilog 构造仍可能不能读? - 如何区分前端不支持的构造与普通的拼写、标点错误?
- 不保留
package/import时,怎样改写并用后续 pass 确认综合输入正常?
一、完整报错与工具版本
最小用例只在包里放一个位宽常量,模块通过通配导入取得 WIDTH,数据通路是纯组合直连。没有类、随机化或测试平台语法,避免把多个 SV 特性混在一起。
package count_pkg;
parameter int WIDTH = 8;
endpackage
module top
import count_pkg::*;
(
input wire [WIDTH-1:0] data_in,
output wire [WIDTH-1:0] data_out
);
assign data_out = data_in;
endmodule在 geek-eda:0.2 容器中先记录版本,再执行原用例。终端卡覆盖版本、实际命令、诊断和退出码;日志由标准输出与标准错误合并而成。
关键不是单独搜索 syntax error,而是把三个位置连起来看:命令行已经带 -sv;前端读到了 package_original.sv;错误精确落在第 6 行的 import count_pkg::*,不是 assign 或端口声明。ORIGINAL_EXIT=1 也确认失败不是一条可忽略的 warning。日志中的 Executing Verilog-2005 frontend 是前端名称,不能据此反推 -sv 没生效。
二、根因:-sv 不是完整 SystemVerilog 兼容开关
SystemVerilog 的 package 用来集中放置参数、类型等声明,import 再把这些名字引入作用域。这个用例符合该语言构造的基本形式,但 Yosys 0.33 在模块头的通配导入位置无法继续解析。因此这里要修的是前端与语言构造的组合,不是把 * 换成另一个标点。
普通语法错误与能力边界可能共享同一条错误模板,区分要靠缩减和对照,而不是靠错误文字猜:
| 观察点 | 普通语法错误 | 本次前端能力边界 |
|---|---|---|
| 最小源码 | 常有缺分号、括号不配对、关键字拼错 | 包、导入、端口和赋值均保持完整 |
| 报错位置 | 指向实际错误 token 或其后的第一个意外 token | 指向标准 import 构造 |
加 -sv 后 | 修正拼写即可通过 | 本版仍停在同一语言构造 |
| 处理方向 | 按行列修源码 | 换成已支持的表达,或更换前端流程 |
| 通过判据 | 前端结束 | 前端结束后再跑 hierarchy/proc/check |
下面的分诊图把这条判断路径展开。红色是入口报错,蓝色是分析动作,橙色是两类修正,绿色表示复跑通过;版本信息随最小用例一起保留,避免换环境后误判。
读图时注意分叉条件不是“有没有报错”,而是“缩成单个标准构造后是否仍失败”。这个结论只绑定本次版本与用例,不应外推成所有 Yosys 版本都拒绝所有包用法。升级工具后要重新跑最小用例,不能用旧经验代替版本实测。
三、修复:包常量改成模块参数
如果包只负责给单个模块提供可配置位宽,直接把 WIDTH 放到模块参数列表即可。默认仍是 8,输入到输出仍是直连;实例化时还能用 #(.WIDTH(16)) 覆盖,参数化能力没有丢。
module top #(
parameter integer WIDTH = 8
) (
input wire [WIDTH-1:0] data_in,
output wire [WIDTH-1:0] data_out
);
assign data_out = data_in;
endmodule复跑不能只停在“这次没报错”。命令继续执行 hierarchy -top top 确认顶层,proc 完成过程转换,check 检查明显设计问题:
yosys -p 'read_verilog -sv localparam_rewritten.sv; hierarchy -top top; proc; check'日志前段出现 Parsing SystemVerilog input 和 Successfully finished Verilog frontend,顶层识别为 top。末段证据如下,Found and reported 0 problems 与 REWRITE_EXIT=0 共同说明改写不仅通过了词法解析,也走完了本次检查链。
3.12. Executing OPT_EXPR pass (perform const folding).
Optimizing module top.
4. Executing CHECK pass (checking for obvious problems).
Checking module top...
Found and reported 0 problems.
End of script. Logfile hash: beb24d1cbf, CPU: user 0.00s system 0.00s, MEM: 9.12 MB peak
Yosys 0.33 (git sha1 2584903a060)
Time spent: 29% 1x opt_expr (0 sec), 19% 2x read_verilog (0 sec), ...
REWRITE_EXIT=0
RESULT: original package rejected; localparam rewrite PASS若工程必须保留大量包内类型、函数和跨模块声明,机械改成模块参数未必合适,可以评估支持完整 SystemVerilog 的前端或 Verilator 转译流程;那条路线需要另行验证生成代码与综合结果,本篇没有把未运行的转译写成已验证方案。
四、排查清单
- 固定版本:先跑
yosys -V,支持边界随版本变化,脱离版本的“支持/不支持”结论不可靠。 - 确认选项真的进入命令:检查 Makefile 变量展开,别让
read_verilog -sv在脚本拼接时丢掉-sv。 - 保留完整诊断:记录源文件、行号、意外 token 和退出码;只看最后一行
ERROR会丢失定位信息。 - 缩到单一特性:移除其他 SV 构造,留下包、导入和一个最小模块,避免多个问题互相遮蔽。
- 按标准构造分流:普通拼写错误直接修;标准构造仍在同一位置失败,就按当前前端边界处理。
- 选择等价改写:常量可改成模块参数,类型与接口要分别评估,不存在一种通用的全局替换。
- 复跑到设计检查:至少看到前端成功、顶层正确、
check为 0 问题和进程退出码 0,再关闭问题。
实验环境
- 机器/系统:Mac / macOS,Yosys 运行于
geek-eda:0.2Docker 容器。 - 工具版本:Yosys 0.33 (git sha1 2584903a060)。
- 日期:2026-10-29。
- 完整命令:
yosys -V;yosys -p 'read_verilog -sv package_original.sv'(退出码 1);yosys -p 'read_verilog -sv localparam_rewritten.sv; hierarchy -top top; proc; check'(退出码 0)。两条读入命令由bash run.sh连续执行,stdout/stderr 合并记录。
代码获取
最小失败源码、模块参数改写、运行脚本和完整日志在公开仓 https://github.com/derekzhuo/geek-doc.cn/tree/main/experiments/ts-yosys-read-verilog-sv-unsupported。本机装好 Yosys 后进入该目录执行 bash run.sh,即可复现原用例退出 1、改写用例通过检查的对照。
这一篇在知识体系里的位置
本篇是 Yosys read_verilog -sv 不支持的语法 报错簇中“语言前端能力边界”的一页;顶层文件路径失败看 Yosys Can't open input file,头文件搜索失败看 Yosys read_verilog include 文件找不到。三类问题都可能停在前端,但分别应改语言构造、输入路径和 include 搜索路径,不应共用一套修复。
总结
Yosys read_verilog -sv 不支持的语法不等于 SystemVerilog 源码本身写错:-sv 只启用当前前端已实现的子集。Yosys 0.33 的最小 package/import 用例在第 6 行报 unexpected TOK_ID 并退出 1;将包常量改为默认 8 位的模块参数后,前端、hierarchy、proc 和 check 全部通过,报告 0 个问题。排错时固定版本、缩减单一构造、区分拼写错误与支持边界,再以完整复跑结果闭环。