声明:代码片段来自于《CPU自制入门》这本书。笔者最近对这方面感兴趣,故想亲自试一试,记录相关笔记
1-1 regfile.h
`ifndef __REGFILE_HEADER__
`define __REGFILE_HEADER__
/*******信号电平******/
`define HIGH 1'b1
`define LOW 1'b0
/*******逻辑值******/
`define ENABLE 1'b0 //有效(负逻辑)
`define DISABLE 1'b1 //无效(负逻辑)
/*******数据******/
`define DATA_W 32 //数据宽度
`define DATA_D 32 //数据深度
`define DataBus 31:0 //数据总线
/*******地址******/
`define ADDR_W 5 //数据深度
`define AddrBus 4:0 //数据总线
`endif
1-2 regfile.c
/***该代码示例来自于《CPU自制入门》P40
功能:32组位宽32的寄存器堆***/
`include "regfile.h"
/*******模块*******/
module regfile(
input wire clk, //时钟
input wire reset_, //异步复位
/******访问接口******/
input wire [`AddrBus] addr, //地址 4:0
input wire [`DataBus] d_in, //输入数据 `DataBus为宏定义31:0 ,查看头文件!
input wire we_, //写入有效
output wire [`DataBus] d_out //输出数据 31:0
);
/******内部信号******/
reg [`DataBus] ff [`DATA_D-1:0]; //寄存器序列
integer i; //迭代器
/******读取访问******/
assign d_out = ff[addr];
/******写入访问******/
always @(posedge clk or negedge reset_) begin
if(reset_ == `ENABLE)begin
/******异步复位******/
for(i=0 ; i<`DATA_D ; i=i+1)begin
ff[i] <= #1 {`DATA_W{1'b0}};
end
end else begin
if(we_ == `ENABLE)begin
ff[addr] <= #1 d_in;
end
end
end
endmodule
Verilog HDL语言与C语言的风格很像,VerilogHDL为了区别宏和变量名,每次使用宏时,在宏前面加上后引号(`)。