数据与有效信号流水线处理
本课属于 Coddy Verilog 学习旅程的“RTL 设计与验证”单元。第 18 课,共 38 课。
流水线将工作分配到各个寄存器中。每个数据项旁边都会传递一个有效标志,这样下游阶段就能区分样本和气泡。使用非阻塞赋值时,后续阶段会在同一个时钟沿读取前一阶段的旧值。复位应使正在处理的工作失效。
相关代码片段;挑战中提供了周边的声明和连接。
always @(posedge clk) begin
stage <= data;
stage_valid <= in_valid;
result <= stage;
out_valid <= stage_valid;
end数据及其有效性经过相同数量的寄存器。
在每个流水线阶段对齐数据和有效信号,并在重置时清除有效信号。
挑战
中等实现一个两级寄存器流水线。每个非复位时钟沿到来时,第一级捕获 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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
RTL 设计与验证中的所有课
自己练习: Verilog 在线编译器