mirror of https://github.com/YosysHQ/picorv32.git
picosoc: increase available memory by using SPRAM instead of BRAM for the Icebreaker example
This commit is contained in:
parent
9b70921103
commit
d21937bafc
|
@ -50,10 +50,10 @@ icebsim: icebreaker_tb.vvp icebreaker_fw.hex
|
||||||
icebsynsim: icebreaker_syn_tb.vvp icebreaker_fw.hex
|
icebsynsim: icebreaker_syn_tb.vvp icebreaker_fw.hex
|
||||||
vvp -N $< +firmware=icebreaker_fw.hex
|
vvp -N $< +firmware=icebreaker_fw.hex
|
||||||
|
|
||||||
icebreaker.json: icebreaker.v spimemio.v simpleuart.v picosoc.v ../picorv32.v
|
icebreaker.json: icebreaker.v ice40up5k_spram.v spimemio.v simpleuart.v picosoc.v ../picorv32.v
|
||||||
yosys -ql icebreaker.log -p 'synth_ice40 -top icebreaker -json icebreaker.json' $^
|
yosys -ql icebreaker.log -p 'synth_ice40 -top icebreaker -json icebreaker.json' $^
|
||||||
|
|
||||||
icebreaker_tb.vvp: icebreaker_tb.v icebreaker.v spimemio.v simpleuart.v picosoc.v ../picorv32.v spiflash.v
|
icebreaker_tb.vvp: icebreaker_tb.v icebreaker.v ice40up5k_spram.v spimemio.v simpleuart.v picosoc.v ../picorv32.v spiflash.v
|
||||||
iverilog -s testbench -o $@ $^ `yosys-config --datdir/ice40/cells_sim.v`
|
iverilog -s testbench -o $@ $^ `yosys-config --datdir/ice40/cells_sim.v`
|
||||||
|
|
||||||
icebreaker_syn_tb.vvp: icebreaker_tb.v icebreaker_syn.v spiflash.v
|
icebreaker_syn_tb.vvp: icebreaker_tb.v icebreaker_syn.v spiflash.v
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PicoSoC - A simple example SoC using PicoRV32
|
||||||
|
*
|
||||||
|
* Copyright (C) 2017 Clifford Wolf <clifford@clifford.at>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
module ice40up5k_spram #(
|
||||||
|
// We current always use the whole SPRAM (128 kB)
|
||||||
|
parameter integer WORDS = 32768
|
||||||
|
) (
|
||||||
|
input clk,
|
||||||
|
input [3:0] wen,
|
||||||
|
input [21:0] addr,
|
||||||
|
input [31:0] wdata,
|
||||||
|
output [31:0] rdata
|
||||||
|
);
|
||||||
|
|
||||||
|
wire cs_0, cs_1;
|
||||||
|
wire [31:0] rdata_0, rdata_1;
|
||||||
|
|
||||||
|
assign cs_0 = !addr[14];
|
||||||
|
assign cs_1 = addr[14];
|
||||||
|
assign rdata = addr[14] ? rdata_1 : rdata_0;
|
||||||
|
|
||||||
|
SB_SPRAM256KA ram00 (
|
||||||
|
.ADDRESS(addr[13:0]),
|
||||||
|
.DATAIN(wdata[15:0]),
|
||||||
|
.MASKWREN({wen[1], wen[1], wen[0], wen[0]}),
|
||||||
|
.WREN(wen[1]|wen[0]),
|
||||||
|
.CHIPSELECT(cs_0),
|
||||||
|
.CLOCK(clk),
|
||||||
|
.STANDBY(1'b0),
|
||||||
|
.SLEEP(1'b0),
|
||||||
|
.POWEROFF(1'b1),
|
||||||
|
.DATAOUT(rdata_0[15:0])
|
||||||
|
);
|
||||||
|
|
||||||
|
SB_SPRAM256KA ram01 (
|
||||||
|
.ADDRESS(addr[13:0]),
|
||||||
|
.DATAIN(wdata[31:16]),
|
||||||
|
.MASKWREN({wen[3], wen[3], wen[2], wen[2]}),
|
||||||
|
.WREN(wen[3]|wen[2]),
|
||||||
|
.CHIPSELECT(cs_0),
|
||||||
|
.CLOCK(clk),
|
||||||
|
.STANDBY(1'b0),
|
||||||
|
.SLEEP(1'b0),
|
||||||
|
.POWEROFF(1'b1),
|
||||||
|
.DATAOUT(rdata_0[31:16])
|
||||||
|
);
|
||||||
|
|
||||||
|
SB_SPRAM256KA ram10 (
|
||||||
|
.ADDRESS(addr[13:0]),
|
||||||
|
.DATAIN(wdata[15:0]),
|
||||||
|
.MASKWREN({wen[1], wen[1], wen[0], wen[0]}),
|
||||||
|
.WREN(wen[1]|wen[0]),
|
||||||
|
.CHIPSELECT(cs_1),
|
||||||
|
.CLOCK(clk),
|
||||||
|
.STANDBY(1'b0),
|
||||||
|
.SLEEP(1'b0),
|
||||||
|
.POWEROFF(1'b1),
|
||||||
|
.DATAOUT(rdata_1[15:0])
|
||||||
|
);
|
||||||
|
|
||||||
|
SB_SPRAM256KA ram11 (
|
||||||
|
.ADDRESS(addr[13:0]),
|
||||||
|
.DATAIN(wdata[31:16]),
|
||||||
|
.MASKWREN({wen[3], wen[3], wen[2], wen[2]}),
|
||||||
|
.WREN(wen[3]|wen[2]),
|
||||||
|
.CHIPSELECT(cs_1),
|
||||||
|
.CLOCK(clk),
|
||||||
|
.STANDBY(1'b0),
|
||||||
|
.SLEEP(1'b0),
|
||||||
|
.POWEROFF(1'b1),
|
||||||
|
.DATAOUT(rdata_1[31:16])
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
|
@ -17,6 +17,12 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
`ifdef PICOSOC_V
|
||||||
|
`error "icebreaker.v must be read before icebreaker.v!"
|
||||||
|
`endif
|
||||||
|
|
||||||
|
`define PICOSOC_MEM ice40up5k_spram
|
||||||
|
|
||||||
module icebreaker (
|
module icebreaker (
|
||||||
input clk,
|
input clk,
|
||||||
|
|
||||||
|
@ -100,7 +106,8 @@ module icebreaker (
|
||||||
|
|
||||||
picosoc #(
|
picosoc #(
|
||||||
.BARREL_SHIFTER(0),
|
.BARREL_SHIFTER(0),
|
||||||
.ENABLE_MULDIV(0)
|
.ENABLE_MULDIV(0),
|
||||||
|
.MEM_WORDS(32768)
|
||||||
) soc (
|
) soc (
|
||||||
.clk (clk ),
|
.clk (clk ),
|
||||||
.resetn (resetn ),
|
.resetn (resetn ),
|
||||||
|
|
|
@ -14,10 +14,14 @@ filesets:
|
||||||
targets:
|
targets:
|
||||||
default:
|
default:
|
||||||
filesets : [picosoc]
|
filesets : [picosoc]
|
||||||
parameters : [PICORV32_REGS]
|
parameters : [PICORV32_REGS, PICOSOC_MEM]
|
||||||
|
|
||||||
parameters:
|
parameters:
|
||||||
PICORV32_REGS:
|
PICORV32_REGS:
|
||||||
datatype : str
|
datatype : str
|
||||||
default : picosoc_regs
|
default : picosoc_regs
|
||||||
paramtype : vlogdefine
|
paramtype : vlogdefine
|
||||||
|
PICOSOC_MEM:
|
||||||
|
datatype : str
|
||||||
|
default : picosoc_mem
|
||||||
|
paramtype : vlogdefine
|
||||||
|
|
|
@ -25,6 +25,14 @@
|
||||||
`define PICORV32_REGS picosoc_regs
|
`define PICORV32_REGS picosoc_regs
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
|
`ifndef PICOSOC_MEM
|
||||||
|
`define PICOSOC_MEM picosoc_mem
|
||||||
|
`endif
|
||||||
|
|
||||||
|
// this macro can be used to check if the verilog files in your
|
||||||
|
// design are read in the correct order.
|
||||||
|
`define PICOSOC_V
|
||||||
|
|
||||||
module picosoc (
|
module picosoc (
|
||||||
input clk,
|
input clk,
|
||||||
input resetn,
|
input resetn,
|
||||||
|
@ -197,7 +205,9 @@ module picosoc (
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
ram_ready <= mem_valid && !mem_ready && mem_addr < 4*MEM_WORDS;
|
ram_ready <= mem_valid && !mem_ready && mem_addr < 4*MEM_WORDS;
|
||||||
|
|
||||||
picosoc_mem #(.WORDS(MEM_WORDS)) memory (
|
`PICOSOC_MEM #(
|
||||||
|
.WORDS(MEM_WORDS)
|
||||||
|
) memory (
|
||||||
.clk(clk),
|
.clk(clk),
|
||||||
.wen((mem_valid && !mem_ready && mem_addr < 4*MEM_WORDS) ? mem_wstrb : 4'b0),
|
.wen((mem_valid && !mem_ready && mem_addr < 4*MEM_WORDS) ? mem_wstrb : 4'b0),
|
||||||
.addr(mem_addr[23:2]),
|
.addr(mem_addr[23:2]),
|
||||||
|
|
Loading…
Reference in New Issue