You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

39 lines
1.9 KiB

`timescale 1ns / 1ps
// 数据存储器
module datamemory#(
parameter ADDR_WIDTH = 12,
parameter DATA_WIDTH = 32
)(
input logic clock,
input logic read_en,
input logic write_en,
input logic [ADDR_WIDTH -1 : 0] address, // read/write address
input logic [DATA_WIDTH -1 : 0] data_in, // write Data
input logic [2:0] funct3, // insn[14:12]
output logic [DATA_WIDTH -1 : 0] data_out // read data
);
logic [DATA_WIDTH - 1 : 0] MEM[(2**(ADDR_WIDTH - 2)) - 1 : 0];
always @(posedge clock)
if (write_en) // sw etc.
case (funct3)
3'b000: MEM[address[ADDR_WIDTH - 1 : 2]][7:0] <= data_in; // sb
3'b001: MEM[address[ADDR_WIDTH - 1 : 2]][15:0] <= data_in; // sh
3'b010: MEM[address[ADDR_WIDTH - 1 : 2]] <= data_in; // sw
default: MEM[address[ADDR_WIDTH - 1 : 2]] <= data_in; // 默认sw
endcase
always_comb
if (read_en) // lw etc.
case (funct3)
3'b000: data_out = {{24{MEM[address[ADDR_WIDTH - 1 : 2]][7]}}, MEM[address[ADDR_WIDTH - 1 : 2]][7:0]}; // lb
3'b001: data_out = {{16{MEM[address[ADDR_WIDTH - 1 : 2]][15]}}, MEM[address[ADDR_WIDTH - 1 : 2]][15:0]}; // lh
3'b010: data_out = MEM[address[ADDR_WIDTH - 1 : 2]]; // lw
3'b100: data_out = {24'b0,MEM[address[ADDR_WIDTH - 1 : 2]][7:0]}; // lbu
3'b101: data_out = {16'b0,MEM[address[ADDR_WIDTH - 1 : 2]][15:0]}; // lhu
default: data_out = MEM[address[ADDR_WIDTH - 1 : 2]]; // 默认lw
endcase
endmodule