寄存器化读端口
本课属于 Coddy Verilog 学习旅程的“RTL 设计与验证”单元。第 23 课,共 38 课。
寄存器读取会在时钟边沿捕获内存数据,并在此后保持该值。读取使能可以在禁用的周期内保留之前的输出。复位读取寄存器不需要清除每个内存字。对于非阻塞的读写赋值,读取表达式会读取边沿到来前的内存字。
相关摘录;挑战中提供了周围的声明和连接。
always @(posedge clk) begin
if(we) mem[waddr] <= data;
if(rst) q <= 0;
else if(re) q <= mem[raddr];
end输出寄存器只会在指定的边沿和使能路径上更新。
记录读取延迟、禁用读取时的行为,以及实际会清除哪些状态。
挑战
中等实现一个 4 个字、8 位的存储器,支持同步写入和寄存读取 q。we 在上升沿写入。rst 同步清零,但只清零 q;否则,re 会从上升沿前的 mem[raddr] 将值加载到 q;当 re=0 时,q 保持不变。存储器不会复位,写入操作不受 rst 影响。如果在一个时钟沿上读写使用相同地址,q 会接收旧字的数据。测试会在启用读取前初始化各个字。输出列:q。所有控制信号和数据在每个时钟上升沿之前都保持稳定;之后观察结果。
完成 design.v,并保留其模块名称和端口。锁定的 testbench.v 会提供输入变化,并在信号稳定后打印输出。它会使用模拟器参数(例如 +CASE=1)选择一种场景;不需要标准输入。不要在设计中添加打印、延迟或模拟终止操作。预期输出为每次观察对应一行十进制值,值之间以一个空格分隔,并以换行符结束。
亲手试试
module dut (input clk, input rst, input we, input re, input [1:0] waddr, input [1:0] raddr, input [7:0] data, output reg [7:0] q);
// 用你的设计替换这个占位内容。
initial q = 0;
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
RTL 设计与验证中的所有课
自己练习: Verilog 在线编译器