Menu
CoddyTech

数据与有效信号流水线处理

本课属于 Coddy Verilog 学习旅程的“RTL 设计与验证”单元。第 18 课,共 38 课。

流水线将工作分配到各个寄存器中。每个数据项旁边都会传递一个有效标志,这样下游阶段就能区分样本和气泡。使用非阻塞赋值时,后续阶段会在同一个时钟沿读取前一阶段的旧值。复位应使正在处理的工作失效。

相关代码片段;挑战中提供了周边的声明和连接。

always @(posedge clk) begin
    stage <= data;
    stage_valid <= in_valid;
    result <= stage;
    out_valid <= stage_valid;
end

数据及其有效性经过相同数量的寄存器。

在每个流水线阶段对齐数据和有效信号,并在重置时清除有效信号。

challenge icon

挑战

中等

实现一个两级寄存器流水线。每个非复位时钟沿到来时,第一级捕获 a 和 in_valid。第二级使用第一级之前的值:out_valid 变为其原来的有效值;当数据有效时,y 变为其原来的数据加一并对 256 取模,否则为零。同步 rst 会清除两个阶段和输出。输出列:y、out_valid。所有控制信号和数据在每个时钟上升沿之前都保持稳定;在时钟沿之后观察结果。

完成 design.v,并保留其模块名称和端口。锁定的 testbench.v 会提供输入变化,并在信号稳定后打印输出。它会使用模拟器参数(例如 +CASE=1)选择场景;不需要标准输入。不要在设计中添加打印、延迟或模拟终止操作。预期输出为每次观察对应一行十进制值,各值之间用一个空格分隔,并以换行符结尾。

亲手试试

module dut (input clk, input rst, input in_valid, input [7:0] a, output reg [7:0] y, output reg out_valid);
    // 用你的设计替换这段占位代码。
    initial y = 0;
    initial out_valid = 0;
endmodule
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

RTL 设计与验证中的所有课

自己练习: Verilog 在线编译器