`timescale 1ns / 1ps `default_nettype none // ----------------------------------------------------------------------------- // EX 级存储数据对齐单元。 // // 依据地址低两位生成写数据与字节写掩码:sw 输出全字 + 1111,sb 把数据的 // 低 8 位搬到对应的字节车道,并只置位对应的写掩码。 // ----------------------------------------------------------------------------- module cpu21_riscv_store_unit ( input wire [31:0] addr_i, input wire [31:0] data_i, input wire mem_write_i, input wire mem_byte_i, output reg [31:0] store_data_o, output reg [ 3:0] store_wstrb_o ); always @* begin store_data_o = data_i; store_wstrb_o = 4'b0; if (mem_write_i) begin if (mem_byte_i) begin case (addr_i[1:0]) 2'd0: begin store_data_o = {24'b0, data_i[7:0]}; store_wstrb_o = 4'b0001; end 2'd1: begin store_data_o = {16'b0, data_i[7:0], 8'b0}; store_wstrb_o = 4'b0010; end 2'd2: begin store_data_o = {8'b0, data_i[7:0], 16'b0}; store_wstrb_o = 4'b0100; end default: begin store_data_o = {data_i[7:0], 24'b0}; store_wstrb_o = 4'b1000; end endcase end else begin store_data_o = data_i; store_wstrb_o = 4'b1111; end end end endmodule `default_nettype wire