mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-07 04:05:19 +00:00
Added ahbapbbridge and cleaning RAM
This commit is contained in:
parent
1d41e98504
commit
f81719337e
@ -44,7 +44,7 @@ module bram1p1rw
|
|||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
) (
|
) (
|
||||||
input logic clk,
|
input logic clk,
|
||||||
input logic ena,
|
input logic en,
|
||||||
input logic [NUM_COL-1:0] we,
|
input logic [NUM_COL-1:0] we,
|
||||||
input logic [ADDR_WIDTH-1:0] addr,
|
input logic [ADDR_WIDTH-1:0] addr,
|
||||||
output logic [DATA_WIDTH-1:0] dout,
|
output logic [DATA_WIDTH-1:0] dout,
|
||||||
@ -60,7 +60,7 @@ module bram1p1rw
|
|||||||
|
|
||||||
always @ (posedge clk) begin
|
always @ (posedge clk) begin
|
||||||
dout <= RAM[addr];
|
dout <= RAM[addr];
|
||||||
if(ena) begin
|
if(en) begin
|
||||||
for(i=0;i<NUM_COL;i=i+1) begin
|
for(i=0;i<NUM_COL;i=i+1) begin
|
||||||
if(we[i]) begin
|
if(we[i]) begin
|
||||||
RAM[addr][i*COL_WIDTH +: COL_WIDTH] <= din[i*COL_WIDTH +:COL_WIDTH];
|
RAM[addr][i*COL_WIDTH +: COL_WIDTH] <= din[i*COL_WIDTH +:COL_WIDTH];
|
||||||
|
@ -42,27 +42,7 @@ module simpleram #(parameter BASE=0, RANGE = 65535) (
|
|||||||
localparam ADDR_WDITH = $clog2(RANGE/8);
|
localparam ADDR_WDITH = $clog2(RANGE/8);
|
||||||
localparam OFFSET = $clog2(`XLEN/8);
|
localparam OFFSET = $clog2(`XLEN/8);
|
||||||
|
|
||||||
|
|
||||||
bram1p1rw #(`XLEN/8, 8, ADDR_WDITH)
|
bram1p1rw #(`XLEN/8, 8, ADDR_WDITH)
|
||||||
memory(.clk, .ena(we), .we(ByteMask), .addr(a[ADDR_WDITH+OFFSET-1:OFFSET]), .dout(rd), .din(wd));
|
memory(.clk, .en(we), .we(ByteMask), .addr(a[ADDR_WDITH+OFFSET-1:OFFSET]), .dout(rd), .din(wd));
|
||||||
|
|
||||||
/* -----\/----- EXCLUDED -----\/-----
|
|
||||||
logic [`XLEN-1:0] RAM[BASE>>(1+`XLEN/32):(RANGE+BASE)>>1+(`XLEN/32)];
|
|
||||||
|
|
||||||
// discard bottom 2 or 3 bits of address offset within word or doubleword
|
|
||||||
localparam adrlsb = (`XLEN==64) ? 3 : 2;
|
|
||||||
logic [31:adrlsb] adrmsbs;
|
|
||||||
assign adrmsbs = a[31:adrlsb];
|
|
||||||
|
|
||||||
always_ff @(posedge clk)
|
|
||||||
rd <= RAM[adrmsbs];
|
|
||||||
|
|
||||||
genvar index;
|
|
||||||
for(index = 0; index < `XLEN/8; index++) begin
|
|
||||||
always_ff @(posedge clk) begin
|
|
||||||
if (we & ByteMask[index]) RAM[adrmsbs][8*(index+1)-1:8*index] <= #1 wd[8*(index+1)-1:8*index];
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-----/\----- EXCLUDED -----/\----- */
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
98
pipelined/src/uncore/ahbapbbridge.sv
Normal file
98
pipelined/src/uncore/ahbapbbridge.sv
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
///////////////////////////////////////////
|
||||||
|
// ahbapbbridge.sv
|
||||||
|
//
|
||||||
|
// Written: David_Harris@hmc.edu & Nic Lucio 7 June 2022
|
||||||
|
//
|
||||||
|
// Purpose: AHB to APB bridge
|
||||||
|
//
|
||||||
|
// A component of the Wally configurable RISC-V project.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
|
||||||
|
//
|
||||||
|
// MIT LICENSE
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
// software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||||
|
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||||
|
// to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
// substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||||
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||||
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
|
||||||
|
// OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
`include "wally-config.vh"
|
||||||
|
|
||||||
|
module ahbapbbridge #(PERIPHS = 2) (
|
||||||
|
input logic HCLK, HRESETn,
|
||||||
|
input logic [PERIPHS-1:0] HSEL,
|
||||||
|
input logic [31:0] HADDR,
|
||||||
|
input logic [`XLEN-1:0] HWDATA,
|
||||||
|
input logic HWRITE,
|
||||||
|
input logic [1:0] HTRANS,
|
||||||
|
input logic HREADY,
|
||||||
|
output logic [`XLEN-1:0] HRDATA,
|
||||||
|
output logic HRESP, HREADYOUT,
|
||||||
|
output logic PCLK, PRESETn,
|
||||||
|
output logic [PERIPHS-1:0] PSEL,
|
||||||
|
output logic PWRITE,
|
||||||
|
output logic PENABLE,
|
||||||
|
output logic [31:0] PADDR,
|
||||||
|
output logic [`XLEN-1:0] PWDATA,
|
||||||
|
input logic [PERIPHS-1:0] PREADY,
|
||||||
|
input var [`XLEN-1:0][PERIPHS-1:0] PRDATA
|
||||||
|
);
|
||||||
|
|
||||||
|
logic activeTrans;
|
||||||
|
logic initTrans, initTransSel, initTransSelD;
|
||||||
|
logic nextPENABLE;
|
||||||
|
|
||||||
|
// convert AHB to APB signals
|
||||||
|
assign PCLK = HCLK;
|
||||||
|
assign PRESETn = HRESETn;
|
||||||
|
|
||||||
|
// identify start of a transaction
|
||||||
|
assign activeTrans = (HTRANS == 2'b10); // only accept nonsequential transactions
|
||||||
|
assign initTrans = activeTrans & HREADY; // start a transaction when the bus is ready and an active transaction is requested
|
||||||
|
assign initTransSel = initTrans & |HSEL; // capture data and address if any of the peripherals are selected
|
||||||
|
|
||||||
|
// delay AHB Address phase signals to align with AHB Data phase because APB expects them at the same time
|
||||||
|
flopenr #(32) addrreg(HCLK, ~HRESETn, initTransSel, HADDR, PADDR);
|
||||||
|
flopenr #(1) writereg(HCLK, ~HRESETn, initTransSel, HWRITE, PWRITE);
|
||||||
|
// enable selreg with iniTrans rather than initTransSel so PSEL can turn off
|
||||||
|
flopenr #(PERIPHS) selreg(HCLK, ~HRESETn, initTrans, HSEL & {PERIPHS{activeTrans}}, PSEL);
|
||||||
|
// AHB Data phase signal doesn't need delay. Note that HWDATA is guaranteed to remain stable until READY is asserted
|
||||||
|
assign PWDATA = HWDATA;
|
||||||
|
|
||||||
|
// enable logic: goes high a cycle after initTrans, then back low on cycle after desired PREADY is asserted
|
||||||
|
// cycle1: AHB puts HADDR, HWRITE, HSEL on bus. initTrans is 1, and these are captured
|
||||||
|
// cycle2: AHB puts HWDATA on the bus. This effectively extends the setup phase
|
||||||
|
// cycle3: bridge raises PENABLE. Peripheral typically responds with PREADY.
|
||||||
|
// Read occurs by end of cycle. Write occurs at end of cycle.
|
||||||
|
flopr #(1) inittransreg(HCLK, ~HRESETn, initTransSel, initTransSelD);
|
||||||
|
assign nextPENABLE = PENABLE ? ~HREADY : initTransSelD;
|
||||||
|
flopr #(1) enablereg(HCLK, ~HRESETn, nextPENABLE, PENABLE);
|
||||||
|
|
||||||
|
// result and ready multiplexer
|
||||||
|
int i;
|
||||||
|
always_comb
|
||||||
|
for (i=0; i<PERIPHS; i++) begin
|
||||||
|
// no peripheral selected: read 0, indicate ready
|
||||||
|
HRDATA = 0;
|
||||||
|
HREADYOUT = 1;
|
||||||
|
if (PSEL[i]) begin // highest numbered peripheral has priority, but multiple PSEL should never be asserted
|
||||||
|
HRDATA = PRDATA[i];
|
||||||
|
HREADYOUT = PREADY[i];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// resp logic
|
||||||
|
assign HRESP = 0; // bridge never indicates errors
|
||||||
|
endmodule
|
||||||
|
|
146
pipelined/src/uncore/gpio_apb.sv
Normal file
146
pipelined/src/uncore/gpio_apb.sv
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
///////////////////////////////////////////
|
||||||
|
// gpio_apb.sv
|
||||||
|
//
|
||||||
|
// Written: David_Harris@hmc.edu 14 January 2021
|
||||||
|
// Modified: bbracker@hmc.edu 15 Apr. 2021
|
||||||
|
//
|
||||||
|
// Purpose: General Purpose I/O peripheral
|
||||||
|
// See FE310-G002-Manual-v19p05 for specifications
|
||||||
|
// No interrupts, drive strength, or pull-ups supported
|
||||||
|
//
|
||||||
|
// A component of the Wally configurable RISC-V project.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
|
||||||
|
//
|
||||||
|
// MIT LICENSE
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
// software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||||
|
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||||
|
// to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
// substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||||
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||||
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
|
||||||
|
// OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
`include "wally-config.vh"
|
||||||
|
|
||||||
|
module gpio_apb (
|
||||||
|
input logic PCLK, PRESETn,
|
||||||
|
input logic PSEL,
|
||||||
|
input logic [7:0] PADDR,
|
||||||
|
input logic [`XLEN-1:0] PWDATA,
|
||||||
|
input logic PWRITE,
|
||||||
|
input logic PENABLE,
|
||||||
|
output logic [`XLEN-1:0] PRDATA,
|
||||||
|
output logic PREADY,
|
||||||
|
input logic [31:0] GPIOPinsIn,
|
||||||
|
output logic [31:0] GPIOPinsOut, GPIOPinsEn,
|
||||||
|
output logic GPIOIntr);
|
||||||
|
|
||||||
|
logic [31:0] input0d, input1d, input2d, input3d;
|
||||||
|
logic [31:0] input_val, input_en, output_en, output_val;
|
||||||
|
logic [31:0] rise_ie, rise_ip, fall_ie, fall_ip, high_ie, high_ip, low_ie, low_ip;
|
||||||
|
|
||||||
|
logic [7:0] entry;
|
||||||
|
logic [31:0] Din, Dout;
|
||||||
|
logic memwrite;
|
||||||
|
|
||||||
|
// APB I/O
|
||||||
|
assign entry = {PADDR[7:2],2'b00}; // 32-bit word-aligned accesses
|
||||||
|
assign memwrite = PWRITE & PENABLE; // only write in access phase
|
||||||
|
assign PREADY = PENABLE; // GPIO never takes >1 cycle to respond
|
||||||
|
|
||||||
|
// account for subword read/write circuitry
|
||||||
|
// -- Note GPIO registers are 32 bits no matter what; access them with LW SW.
|
||||||
|
// (At least that's what I think when FE310 spec says "only naturally aligned 32-bit accesses are supported")
|
||||||
|
if (`XLEN == 64) begin
|
||||||
|
assign Din = entry[2] ? PWDATA[63:32] : PWDATA[31:0];
|
||||||
|
assign PRDATA = entry[2] ? {Dout,32'b0} : {32'b0,Dout};
|
||||||
|
end else begin // 32-bit
|
||||||
|
assign Din = PWDATA[31:0];
|
||||||
|
assign PRDATA = Dout;
|
||||||
|
end
|
||||||
|
|
||||||
|
// register access
|
||||||
|
always_ff @(posedge PCLK, negedge PRESETn)
|
||||||
|
if (~PRESETn) begin // asynch reset
|
||||||
|
input_en <= 0;
|
||||||
|
output_en <= 0;
|
||||||
|
// *** synch reset not yet implemented [DH: can we delete this comment? Check if a sync reset is required]
|
||||||
|
output_val <= #1 0;
|
||||||
|
rise_ie <= #1 0;
|
||||||
|
rise_ip <= #1 0;
|
||||||
|
fall_ie <= #1 0;
|
||||||
|
fall_ip <= #1 0;
|
||||||
|
high_ie <= #1 0;
|
||||||
|
high_ip <= #1 0;
|
||||||
|
low_ie <= #1 0;
|
||||||
|
low_ip <= #1 0;
|
||||||
|
end else begin // writes
|
||||||
|
// According to FE310 spec: Once the interrupt is pending, it will remain set until a 1 is written to the *_ip register at that bit.
|
||||||
|
/* verilator lint_off CASEINCOMPLETE */
|
||||||
|
if (memwrite)
|
||||||
|
case(entry)
|
||||||
|
8'h04: input_en <= #1 Din;
|
||||||
|
8'h08: output_en <= #1 Din;
|
||||||
|
8'h0C: output_val <= #1 Din;
|
||||||
|
8'h18: rise_ie <= #1 Din;
|
||||||
|
8'h20: fall_ie <= #1 Din;
|
||||||
|
8'h28: high_ie <= #1 Din;
|
||||||
|
8'h30: low_ie <= #1 Din;
|
||||||
|
8'h40: output_val <= #1 output_val ^ Din; // OUT_XOR
|
||||||
|
endcase
|
||||||
|
/* verilator lint_on CASEINCOMPLETE */
|
||||||
|
|
||||||
|
// interrupts can be cleared by writing corresponding bits to a register
|
||||||
|
if (memwrite & entry == 8'h1C) rise_ip <= rise_ip & ~Din;
|
||||||
|
else rise_ip <= rise_ip | (input2d & ~input3d);
|
||||||
|
if (memwrite & (entry == 8'h24)) fall_ip <= fall_ip & ~Din;
|
||||||
|
else fall_ip <= fall_ip | (~input2d & input3d);
|
||||||
|
if (memwrite & (entry == 8'h2C)) high_ip <= high_ip & ~Din;
|
||||||
|
else high_ip <= high_ip | input3d;
|
||||||
|
if (memwrite & (entry == 8'h34)) low_ip <= low_ip & ~Din;
|
||||||
|
else low_ip <= low_ip | ~input3d;
|
||||||
|
|
||||||
|
case(entry) // flop to sample inputs
|
||||||
|
8'h00: Dout <= #1 input_val;
|
||||||
|
8'h04: Dout <= #1 input_en;
|
||||||
|
8'h08: Dout <= #1 output_en;
|
||||||
|
8'h0C: Dout <= #1 output_val;
|
||||||
|
8'h18: Dout <= #1 rise_ie;
|
||||||
|
8'h1C: Dout <= #1 rise_ip;
|
||||||
|
8'h20: Dout <= #1 fall_ie;
|
||||||
|
8'h24: Dout <= #1 fall_ip;
|
||||||
|
8'h28: Dout <= #1 high_ie;
|
||||||
|
8'h2C: Dout <= #1 high_ip;
|
||||||
|
8'h30: Dout <= #1 low_ie;
|
||||||
|
8'h34: Dout <= #1 low_ip;
|
||||||
|
8'h40: Dout <= #1 0; // OUT_XOR reads as 0
|
||||||
|
default: Dout <= #1 0;
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
|
||||||
|
// chip i/o
|
||||||
|
// connect OUT to IN for loopback testing
|
||||||
|
if (`GPIO_LOOPBACK_TEST) assign input0d = ((output_en & GPIOPinsOut) | (~output_en & GPIOPinsIn)) & input_en;
|
||||||
|
else assign input0d = GPIOPinsIn & input_en;
|
||||||
|
|
||||||
|
// synchroninzer for inputs
|
||||||
|
flop #(32) sync1(PCLK,input0d,input1d);
|
||||||
|
flop #(32) sync2(PCLK,input1d,input2d);
|
||||||
|
flop #(32) sync3(PCLK,input2d,input3d);
|
||||||
|
assign input_val = input3d;
|
||||||
|
assign GPIOPinsOut = output_val;
|
||||||
|
assign GPIOPinsEn = output_en;
|
||||||
|
|
||||||
|
assign GPIOIntr = |{(rise_ip & rise_ie),(fall_ip & fall_ie),(high_ip & high_ie),(low_ip & low_ie)};
|
||||||
|
endmodule
|
||||||
|
|
@ -63,6 +63,7 @@ module ram #(parameter BASE=0, RANGE = 65535) (
|
|||||||
// *** this seems like a weird way to use reset
|
// *** this seems like a weird way to use reset
|
||||||
flopenr #(1) memwritereg(HCLK, 1'b0, initTrans | ~HRESETn, HSELRam & HWRITE, memwrite);
|
flopenr #(1) memwritereg(HCLK, 1'b0, initTrans | ~HRESETn, HSELRam & HWRITE, memwrite);
|
||||||
flopenr #(32) haddrreg(HCLK, 1'b0, initTrans | ~HRESETn, HADDR, A);
|
flopenr #(32) haddrreg(HCLK, 1'b0, initTrans | ~HRESETn, HADDR, A);
|
||||||
|
|
||||||
// busy FSM to extend READY signal
|
// busy FSM to extend READY signal
|
||||||
always @(posedge HCLK, negedge HRESETn)
|
always @(posedge HCLK, negedge HRESETn)
|
||||||
if (~HRESETn) begin
|
if (~HRESETn) begin
|
||||||
|
107
pipelined/src/uncore/ram_orig.sv
Normal file
107
pipelined/src/uncore/ram_orig.sv
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
///////////////////////////////////////////
|
||||||
|
// ram_orig.sv
|
||||||
|
//
|
||||||
|
// Written: David_Harris@hmc.edu 9 January 2021
|
||||||
|
// Modified:
|
||||||
|
//
|
||||||
|
// Purpose: On-chip RAM, external to core
|
||||||
|
//
|
||||||
|
// A component of the Wally configurable RISC-V project.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
|
||||||
|
//
|
||||||
|
// MIT LICENSE
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
// software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||||
|
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||||
|
// to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
// substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||||
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||||
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
|
||||||
|
// OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
`include "wally-config.vh"
|
||||||
|
|
||||||
|
module ram_orig #(parameter BASE=0, RANGE = 65535) (
|
||||||
|
input logic HCLK, HRESETn,
|
||||||
|
input logic HSELRam,
|
||||||
|
input logic [31:0] HADDR,
|
||||||
|
input logic HWRITE,
|
||||||
|
input logic HREADY,
|
||||||
|
input logic [1:0] HTRANS,
|
||||||
|
input logic [`XLEN-1:0] HWDATA,
|
||||||
|
input logic [3:0] HSIZED,
|
||||||
|
output logic [`XLEN-1:0] HREADRam,
|
||||||
|
output logic HRESPRam, HREADYRam
|
||||||
|
);
|
||||||
|
|
||||||
|
// Desired changes.
|
||||||
|
// 1. find a way to merge read and write address into 1 port.
|
||||||
|
// 2. remove all unnecessary latencies. (HREADY needs to be able to constant high.)
|
||||||
|
// 3. implement burst.
|
||||||
|
// 4. remove the configurable latency.
|
||||||
|
|
||||||
|
logic [`XLEN/8-1:0] ByteMaskM;
|
||||||
|
logic [31:0] HWADDR, A;
|
||||||
|
logic prevHREADYRam, risingHREADYRam;
|
||||||
|
logic initTrans;
|
||||||
|
logic memwrite;
|
||||||
|
logic [3:0] busycount;
|
||||||
|
|
||||||
|
swbytemask swbytemask(.Size(HSIZED[1:0]), .Adr(HWADDR[2:0]), .ByteMask(ByteMaskM));
|
||||||
|
|
||||||
|
assign initTrans = HREADY & HSELRam & (HTRANS != 2'b00);
|
||||||
|
|
||||||
|
// *** this seems like a weird way to use reset
|
||||||
|
flopenr #(1) memwritereg(HCLK, 1'b0, initTrans | ~HRESETn, HSELRam & HWRITE, memwrite);
|
||||||
|
flopenr #(32) haddrreg(HCLK, 1'b0, initTrans | ~HRESETn, HADDR, A);
|
||||||
|
|
||||||
|
// busy FSM to extend READY signal
|
||||||
|
always @(posedge HCLK, negedge HRESETn)
|
||||||
|
if (~HRESETn) begin
|
||||||
|
busycount <= 0;
|
||||||
|
HREADYRam <= #1 0;
|
||||||
|
end else begin
|
||||||
|
if (initTrans) begin
|
||||||
|
busycount <= 0;
|
||||||
|
HREADYRam <= #1 0;
|
||||||
|
end else if (~HREADYRam) begin
|
||||||
|
if (busycount == 0) begin // Ram latency, for testing purposes. *** test with different values such as 2
|
||||||
|
HREADYRam <= #1 1;
|
||||||
|
end else begin
|
||||||
|
busycount <= busycount + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assign HRESPRam = 0; // OK
|
||||||
|
|
||||||
|
localparam ADDR_WDITH = $clog2(RANGE/8);
|
||||||
|
localparam OFFSET = $clog2(`XLEN/8);
|
||||||
|
|
||||||
|
// Rising HREADY edge detector
|
||||||
|
// Indicates when ram is finishing up
|
||||||
|
// Needed because HREADY may go high for other reasons,
|
||||||
|
// and we only want to write data when finishing up.
|
||||||
|
flopenr #(1) prevhreadyRamreg(HCLK,~HRESETn, 1'b1, HREADYRam,prevHREADYRam);
|
||||||
|
assign risingHREADYRam = HREADYRam & ~prevHREADYRam;
|
||||||
|
|
||||||
|
always @(posedge HCLK)
|
||||||
|
HWADDR <= #1 A;
|
||||||
|
|
||||||
|
bram2p1r1w #(`XLEN/8, 8, ADDR_WDITH, `FPGA)
|
||||||
|
memory(.clk(HCLK), .enaA(1'b1),
|
||||||
|
.addrA(A[ADDR_WDITH+OFFSET-1:OFFSET]), .doutA(HREADRam),
|
||||||
|
.enaB(memwrite & risingHREADYRam), .weB(ByteMaskM),
|
||||||
|
.addrB(HWADDR[ADDR_WDITH+OFFSET-1:OFFSET]), .dinB(HWDATA));
|
||||||
|
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -194,7 +194,7 @@ module uncore (
|
|||||||
({`XLEN{HSELSDCD}} & HREADSDC);
|
({`XLEN{HSELSDCD}} & HREADSDC);
|
||||||
|
|
||||||
assign HRESP = HSELRamD & HRESPRam |
|
assign HRESP = HSELRamD & HRESPRam |
|
||||||
HSELEXTD & HRESPEXT |
|
HSELEXTD & HRESPEXT |
|
||||||
HSELCLINTD & HRESPCLINT |
|
HSELCLINTD & HRESPCLINT |
|
||||||
HSELPLICD & HRESPPLIC |
|
HSELPLICD & HRESPPLIC |
|
||||||
HSELGPIOD & HRESPGPIO |
|
HSELGPIOD & HRESPGPIO |
|
||||||
@ -203,7 +203,7 @@ module uncore (
|
|||||||
HSELSDC & HRESPSDC;
|
HSELSDC & HRESPSDC;
|
||||||
|
|
||||||
assign HREADY = HSELRamD & HREADYRam |
|
assign HREADY = HSELRamD & HREADYRam |
|
||||||
HSELEXTD & HREADYEXT |
|
HSELEXTD & HREADYEXT |
|
||||||
HSELCLINTD & HREADYCLINT |
|
HSELCLINTD & HREADYCLINT |
|
||||||
HSELPLICD & HREADYPLIC |
|
HSELPLICD & HREADYPLIC |
|
||||||
HSELGPIOD & HREADYGPIO |
|
HSELGPIOD & HREADYGPIO |
|
||||||
|
Loading…
Reference in New Issue
Block a user