数字IC秋招手撕代码(九)可参数化的数字手撕数化设计多端口寄存器堆设计
- 题目
- 分析
- 代码
题目
用verilog设计一个可参数化的寄存器堆,同一时刻输入的秋招器堆写地址互不相同,但读地址可以相同,代码的多端口所有端口都能连续响应读写请求。可参
分析
- 首先题目要求了是寄存可参数化的多端口寄存器堆,需要通过多个端口对寄存器堆读写,数字手撕数化设计这势必要用for循环的秋招器堆方式完成;
- 其次要根据en、wr信号进行读写状态的代码的多端口区分;
- 在本题中最为关键的其实是写状态时,din向缓冲区传输的可参过程,很多朋友可能都会是寄存下列的做法。
genvar i;generatealways @(posedge clk or negedge rst_n)begin if(!rst_n)begin for(integer j=0;j
上述代码乍一看好像没什么问题,数字手撕数化设计输入也保证了写地址不会相同,秋招器堆但其实data上存在multi path的代码的多端口问题,电路的可参角度上是确实存在多个数据同时向同一寄存器写入的问题。 所以需要对din提前mux处理,寄存再将mux的结果写入寄存器,这样才能完美的避免multi path。
代码
module register_file(clk,rst_n,en,wr,addr,din,dout);parameter PORT = 2;parameter WIDTH = 32;parameter DEPTH = 128;parameter DEPTH_L = log2(DEPTH);input clk;input rst_n;input [PORT-1:0] en;input [PORT-1:0] wr;input [PORT-1:0][DEPTH_L-1:0] addr;input [PORT-1:0][DEPTH_L-1:0] din;output [PORT-1:0][WIDTH-1:0] dout;wire [DEPTH-1:0][PORT-1:0] wr_hit;wire [DEPTH-1:0][WIDTH-1:0] din_mux;reg [DEPTH-1:0][WIDTH-1:0] data;reg [PORT-1:0][WIDTH-1:0] dout;genvar g,h;generate for(g=0;g
搜索关注我的微信公众号【IC墨鱼仔】,获取我的更多IC干货分享!