CHIP DESIGN · COURSE

使用 SystemVerilog 进行 RTL 设计

把周期精确硬件需求转换为可移植、可审查的 SystemVerilog RTL。课程从模块契约与工具边界开始,依次推导精确打包类型、表达式定宽、组合与时序所有权、复位、参数、生成结构、valid-ready 反压、控制/数据通路划分、有限状态恢复与有界时钟/复位跨越。断言、lint、综合对账、参数边界与变更敏感证据闭合学习循环。每个结论都说明它来自语言语义、仿真、综合、时序分析,还是后续物理适配实验。

本课程之前: 已完成数字逻辑与布尔推理,以及计算机体系结构第 1–4 章。课程假设掌握二进制表示、布尔/组合逻辑、寄存器、FSM、同步时序、ISA 状态、数据通路与多周期控制,但不要求先安装 HDL 工具或掌握验证框架。

COURSE FACTSStage, chapters, units, prerequisite, and outcome
第 1 章

模块接口是定时硬件契约

目标: 仅端口列表无法表达什么? 作答时请说明硬件所有者、更新事件、位宽,以及一个应使证据失败的变更。

模块边界命名数值与方向,但可用接口还要说明每个值何时有效、由哪一侧负责改变。 寄存器传输级设计描述命名状态元件在时钟事件之间传递的数值,以及推导下一数值的组合逻辑。SystemVerilog 源码并不像普通顺序程序那样执行:仿真器按语言语义调度事件,综合工具则从受支持子集推断有界硬件结构。因此每课都区分源代码含义、仿真观测、推断硬件意图、时序假设,以及仍需由 lint、仿真、综合、约束与实现提供的证据。

本知识点的规格是:同步递增器在上升沿 in_valid 为高时接受一个 8 位输入,并在恰好一个周期后以 out_valid 发布输入+1;复位抑制输出有效性。 需要推导的不变量是:每个已接受输入在一个周期后恰好产生一个匹配输出,未接受周期不会产生有效输出。 编写过程前,先说明信号所有者、位宽、有符号解释、时钟域、复位状态、更新事件、有效区间、非法输入、延迟、吞吐与反压行为。然后判断每个输出是持续组合结果、寄存状态还是协议证据。保留故障边界“未明确延迟会让测试平台在接受周期采样组合 input+1,而实现却在下一周期寄存输出。”,因为仅有干净编译或漂亮波形可能掩盖错误电路。

每个已接受输入在一个周期后恰好产生一个匹配输出,未接受周期不会产生有效输出。 该结论只适用于已声明的可综合模型与时钟/复位假设;它本身不能证明特定单元网表、时钟频率、面积、功耗、CDC 收敛、FPGA 行为或制造硅片。

在接受边沿,把 8 位输入与一个有效位捕获到模块所有寄存器。 在推导第 1 步,指出该值来自边沿前状态、组合逻辑计算,还是在有效边沿发布。应用运算符前追踪完整位宽与符号属性,并说明哪个赋值或握手转移所有权。

组合加法按声明的 8 位策略推导扩宽或回绕结果。 在推导第 2 步,指出该值来自边沿前状态、组合逻辑计算,还是在有效边沿发布。应用运算符前追踪完整位宽与符号属性,并说明哪个赋值或握手转移所有权。

在下一边沿发布保留结果与有效身份,除非复位覆盖状态。 在推导第 3 步,指出该值来自边沿前状态、组合逻辑计算,还是在有效边沿发布。应用运算符前追踪完整位宽与符号属性,并说明哪个赋值或握手转移所有权。

追踪复位解除后,在连续边沿接受输入 7 与 255,并采用 8 位回绕。 先写出每个相关事件前后的预期数值,再描述能够拥有这些数值的最小可综合结构。

  1. 接受 7 后,当前输出仍为先前无效状态,同时保留 8 供下一次发布。 在追踪第 1 步,记录原始位与解释数值、活动过程、事件区域或边沿、使能与复位状态,以及结果是暂定还是已在接口可观察。
  2. 下一边沿发布 8,同时接受 255 并保留回绕后的 0。 在追踪第 2 步,记录原始位与解释数值、活动过程、事件区域或边沿、使能与复位状态,以及结果是暂定还是已在接口可观察。
  3. 再下一边沿以 valid 高发布 0。 在追踪第 3 步,记录原始位与解释数值、活动过程、事件区域或边沿、使能与复位状态,以及结果是暂定还是已在接口可观察。

结果: 接受序列 7、255 分别在一个周期后产生有效输出 8、0。 只有当追踪、断言与推断结构预期一致时才接受结果。若未运行综合,应明确写“仅仿真契约”;若未约束并分析时序,则不能声称频率。