Altifigence Academy

1 / 37 · 概念

RTL:描述并发工作的电路

区分软件执行顺序与硬件并行结构,明确当前状态、下一状态和观察时刻。

电路持续工作

RTL 描述数值如何经过组合逻辑在寄存器之间移动。模块是硬件边界,两个实例是相互连接的结构,不是先调用一个函数再调用另一个。输入改变时电路仍在工作。把数字逻辑电路中的门、存储和状态机转成明确的 SystemVerilog 接口与可复现验证。实现前应说明每个信号的位宽、驱动源、有效时刻和复位行为。

分开当前状态与下一状态

这个完整模块将无符号 4 位 sample 累加到 8 位寄存器。复位同步、高有效,优先于 enable。有使能的边沿执行加法,其余边沿保持 sum,算术按模 256 回绕。

SystemVerilog
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
endmodule

next_sum 是组合结果,即使没有时钟边沿,sum 或 sample 改变也会改变它。sum 存储状态,在上升沿更新。同样声明为 logic 不代表相同硬件作用。时钟块省略最后的 else 表示保持寄存器;组合块漏赋值则可能要求锁存器。先看清块的类型。

仿真前计算边沿表

每行使用边沿前的状态和输入,在非阻塞更新后观察结果。

边沿rstenablesample更新前 sum更新后 sum
E0119未知0
E101303
E200733
E301538
E4111580

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。

一起保存源码、边沿表和期望值。课程完成标记是学习记录,与仿真运行不同。

你的选择适用于此浏览器,可随时在页脚更改。