mirror of
https://github.com/olofk/serv.git
synced 2025-04-21 20:37:06 -04:00
46 lines
1.2 KiB
Verilog
46 lines
1.2 KiB
Verilog
`default_nettype none
|
|
module servant_ram
|
|
#(//Memory parameters
|
|
parameter depth = 256,
|
|
parameter aw = $clog2(depth),
|
|
parameter RESET_STRATEGY = "",
|
|
parameter memfile = "")
|
|
(input wire i_wb_clk,
|
|
input wire i_wb_rst,
|
|
input wire [aw-1:2] i_wb_adr,
|
|
input wire [31:0] i_wb_dat,
|
|
input wire [3:0] i_wb_sel,
|
|
input wire i_wb_we,
|
|
input wire i_wb_cyc,
|
|
output reg [31:0] o_wb_rdt,
|
|
output reg o_wb_ack);
|
|
|
|
wire [3:0] we = {4{i_wb_we & i_wb_cyc}} & i_wb_sel;
|
|
|
|
reg [31:0] mem [0:depth/4-1] /* verilator public */;
|
|
|
|
wire [aw-3:0] addr = i_wb_adr[aw-1:2];
|
|
|
|
always @(posedge i_wb_clk)
|
|
if (i_wb_rst & (RESET_STRATEGY != "NONE"))
|
|
o_wb_ack <= 1'b0;
|
|
else
|
|
o_wb_ack <= i_wb_cyc & !o_wb_ack;
|
|
|
|
always @(posedge i_wb_clk) begin
|
|
if (we[0]) mem[addr][7:0] <= i_wb_dat[7:0];
|
|
if (we[1]) mem[addr][15:8] <= i_wb_dat[15:8];
|
|
if (we[2]) mem[addr][23:16] <= i_wb_dat[23:16];
|
|
if (we[3]) mem[addr][31:24] <= i_wb_dat[31:24];
|
|
o_wb_rdt <= mem[addr];
|
|
end
|
|
|
|
initial
|
|
if(|memfile) begin
|
|
`ifndef ISE
|
|
$display("Preloading %m from %s", memfile);
|
|
`endif
|
|
$readmemh(memfile, mem);
|
|
end
|
|
|
|
endmodule
|