1 / 37 · 概念
RTL:描述并发工作的电路
区分软件执行顺序与硬件并行结构,明确当前状态、下一状态和观察时刻。
课时内容可免费阅读,选课后可保存学习进度。
电路持续工作
RTL 描述数值如何经过组合逻辑在寄存器之间移动。模块是硬件边界,两个实例是相互连接的结构,不是先调用一个函数再调用另一个。输入改变时电路仍在工作。把数字逻辑电路中的门、存储和状态机转成明确的 SystemVerilog 接口与可复现验证。实现前应说明每个信号的位宽、驱动源、有效时刻和复位行为。
分开当前状态与下一状态
这个完整模块将无符号 4 位 sample 累加到 8 位寄存器。复位同步、高有效,优先于 enable。有使能的边沿执行加法,其余边沿保持 sum,算术按模 256 回绕。
module accumulator (
input logic clk, rst, enable,
input logic [3:0] sample,
output logic [7:0] sum
);
logic [7:0] next_sum;
assign next_sum = sum + {4'b0000, sample};
always_ff @(posedge clk) begin
if (rst) sum <= 8'b0;
else if (enable) sum <= next_sum;
end
endmodulenext_sum 是组合结果,即使没有时钟边沿,sum 或 sample 改变也会改变它。sum 存储状态,在上升沿更新。同样声明为 logic 不代表相同硬件作用。时钟块省略最后的 else 表示保持寄存器;组合块漏赋值则可能要求锁存器。先看清块的类型。
仿真前计算边沿表
每行使用边沿前的状态和输入,在非阻塞更新后观察结果。
| 边沿 | rst | enable | sample | 更新前 sum | 更新后 sum |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 未知 | 0 |
| E1 | 0 | 1 | 3 | 0 | 3 |
| E2 | 0 | 0 | 7 | 3 | 3 |
| E3 | 0 | 1 | 5 | 3 | 8 |
| E4 | 1 | 1 | 15 | 8 | 0 |
E4 复位优先,不做加法。旧 sum=250、接受的 sample=10 时,8 位结果是 4。保留第九位意味着改变接口和算术契约。
赋值顺序属于局部,并发属于结构
组合过程内阻塞赋值 = 按过程顺序执行。不同过程及连续赋值作为并发进程调度。时钟过程的非阻塞赋值 <= 用过程执行时可见的值计算右侧,再安排更新。源码顺序不能替代延迟契约。不要在累加器中用 #10 表示等待一个时钟;延迟和时钟发生器属于后面的通用仿真测试平台。可综合状态转移通过边沿和状态表达,不是软件 sleep。
练习:改变一项要求
将回绕改为在 255 饱和。显式扩展两个操作数后计算 9 位和,位 8 为 1 则存 255,否则存 7:0。保持 reset 与 enable 优先级。测试 0+0、250+5、250+6、禁用边沿、同时 reset/enable;期望依次是 0、255、255、保持旧状态、0。只测 250+5 不能暴露进位丢失,必须包含 250+6。
一起保存源码、边沿表和期望值。课程完成标记是学习记录,与仿真运行不同。