2 / 37 · 概念
信号与端口:位宽、方向和时间的约定
阅读接口约定,区分组合输出与状态输出的验证标准。
课时内容可免费阅读,选课后可保存学习进度。
把端口列表读成电路约定
input logic [7:0] data 是同时传送 8 个比特的端口,并不是 8 个值依次到达。仅有 logic 数据类型也不会产生存储元件。硬件行为取决于它由组合赋值驱动,还是由基于边沿的时序块驱动。
阅读信号时,除位宽和方向外,还应确认何时有效、由谁驱动以及复位后是什么值。缺少这些信息时,即使各模块单独正确,连接后的系统也可能出错。
同一个 MUX 也有两类输出
本课程的实验同时观察选择结果 y 及保存该结果的 sampled_y。
第一个表达式描述组合功能,第二个描述在边沿存储此前已稳定 y 的理想同步模型。若一概将两个输出都与同一瞬间的输入比较,就会把正常寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多判为错误。
assign y = sel ? b : a;
always_ff @(posedge clk) sampled_y <= y;在模拟器中,即使时间值相同,也有事件处理顺序。实际器件则有 setupsetup 捕获时钟边沿之前,输入数据必须保持稳定的最短时间。违反建立时间就无法保证存储结果。了解更多/hold 及 clock-to-Q 延迟。这里的两个表达式并未消除这些差别,而是为功能验证明确观察时刻的起点。
箭头表示数据依赖关系。a、b、sel 改变时,组合输出 y 先改变,而 sampled_y 只在上升沿上升沿 时钟从 0 变为 1 的瞬间。它不同于表示整个 CLK=1 区间的电平。了解更多存储新值。
- a · b · sel: 同时给定的输入
- MUX → y: 由当前选择信号计算
- DFF → sampled_y: 在上升沿存储 y
需要审查的问题
- sel 是确定为 0/1 的输入,还是异步外部信号?
- y 改变后,与 sampled_y 比较的时刻是否在下一个有效边沿之后?
- sampled_y 的初值由复位复位 将状态恢复为规定初值的控制。必须同时规定其同步或异步性质,以及相对于其他控制的优先级。了解更多确定,还是采用工具的初始化设置?
本实验的显式初值用于建立可复现的 0/1 模型。不能把初值设置理解为实际芯片上电行为的保证。
自己试试
在两个时钟边沿之间,a 从 0 变为 1,sel 始终为 0。y 与 sampled_y 分别何时变化?
阅读解释
组合输出 y 在相应组合路径完成求值或传播后改变。sampled_y 在捕获该值的下一个上升沿更新。边沿附近的输入变化涉及实际电路的 setup/hold 问题,不能仅凭这个简化模型断定安全。