mirror of https://github.com/VLSIDA/OpenRAM.git
Added unit test for multibank
This commit is contained in:
parent
d36f74a514
commit
8f00e396cd
|
|
@ -0,0 +1,54 @@
|
|||
#!/usr/bin/env python3
|
||||
# See LICENSE for licensing information.
|
||||
#
|
||||
# Copyright (c) 2016-2021 Regents of the University of California and The Board
|
||||
# of Regents for the Oklahoma Agricultural and Mechanical College
|
||||
# (acting for and on behalf of Oklahoma State University)
|
||||
# All rights reserved.
|
||||
#
|
||||
import unittest
|
||||
from testutils import *
|
||||
import sys, os
|
||||
sys.path.append(os.getenv("OPENRAM_HOME"))
|
||||
import globals
|
||||
from globals import OPTS
|
||||
import debug
|
||||
|
||||
|
||||
class multibank_verilog_test(openram_test):
|
||||
|
||||
def runTest(self):
|
||||
config_file = "{}/tests/configs/config".format(os.getenv("OPENRAM_HOME"))
|
||||
globals.init_openram(config_file)
|
||||
OPTS.route_supplies=False
|
||||
OPTS.check_lvsdrc=False
|
||||
OPTS.netlist_only=True
|
||||
from sram import sram
|
||||
from sram_config import sram_config
|
||||
c = sram_config(word_size=2,
|
||||
num_words=16,
|
||||
num_banks=2)
|
||||
c.words_per_row=1
|
||||
c.recompute_sizes()
|
||||
debug.info(1, "Testing Verilog for sample 2 bit, 16 words SRAM with 2 bank")
|
||||
# This doesn't have to use the factory since worst case
|
||||
# it will just replaece the top-level module of the same name
|
||||
s = sram(c, "sram_2_16_2_{0}".format(OPTS.tech_name))
|
||||
|
||||
vfile = s.name + ".v"
|
||||
vname = OPTS.openram_temp + vfile
|
||||
s.verilog_write(vname)
|
||||
|
||||
|
||||
# let's diff the result with a golden model
|
||||
golden = "{0}/golden/{1}".format(os.path.dirname(os.path.realpath(__file__)), vfile)
|
||||
self.assertTrue(self.isdiff(vname, golden))
|
||||
|
||||
globals.end_openram()
|
||||
|
||||
# run the test from the command line
|
||||
if __name__ == "__main__":
|
||||
(OPTS, args) = globals.parse_args()
|
||||
del sys.argv[1:]
|
||||
header(__file__, OPTS.tech_name)
|
||||
unittest.main(testRunner=debugTestRunner())
|
||||
|
|
@ -72,6 +72,7 @@ BROKEN_STAMPS = \
|
|||
sky130/23_lib_sram_prune_test.ok \
|
||||
sky131/23_lib_sram_test.ok \
|
||||
%/26_hspice_pex_pinv_test.ok \
|
||||
%/27_verilog_multibank_test.ok \
|
||||
%/50_riscv_1k_1rw1r_func_test.ok \
|
||||
%/50_riscv_1k_1rw_func_test.ok \
|
||||
%/50_riscv_1rw1r_func_test.ok \
|
||||
|
|
|
|||
|
|
@ -0,0 +1,105 @@
|
|||
|
||||
module sram (
|
||||
`ifdef USE_POWER_PINS
|
||||
vdd,
|
||||
gnd,
|
||||
`endif
|
||||
clk0,
|
||||
addr0,
|
||||
din0,
|
||||
csb0,
|
||||
web0,
|
||||
dout0
|
||||
);
|
||||
|
||||
parameter DATA_WIDTH = 2;
|
||||
parameter ADDR_WIDTH= 4;
|
||||
|
||||
parameter BANK_SEL = 1;
|
||||
parameter NUM_WMASK = 1;
|
||||
|
||||
`ifdef USE_POWER_PINS
|
||||
inout vdd;
|
||||
inout gnd;
|
||||
`endif
|
||||
input clk0;
|
||||
input [ADDR_WIDTH - 1 : 0] addr0;
|
||||
input [DATA_WIDTH - 1: 0] din0;
|
||||
input csb0;
|
||||
input web0;
|
||||
output reg [DATA_WIDTH - 1 : 0] dout0;
|
||||
|
||||
reg [ADDR_WIDTH - 1 : 0] addr0_reg;
|
||||
|
||||
wire [DATA_WIDTH - 1 : 0] dout0_bank0;
|
||||
|
||||
reg web0_bank0;
|
||||
|
||||
reg csb0_bank0;
|
||||
|
||||
wire [DATA_WIDTH - 1 : 0] dout0_bank1;
|
||||
|
||||
reg web0_bank1;
|
||||
|
||||
reg csb0_bank1;
|
||||
|
||||
|
||||
sram_1bank bank0 (
|
||||
`ifdef USE_POWER_PINS
|
||||
.vdd(vdd),
|
||||
.gnd(gnd),
|
||||
`endif
|
||||
.clk0(clk0),
|
||||
.addr0(addr0[ADDR_WIDTH - BANK_SEL - 1 : 0]),
|
||||
.din0(din0),
|
||||
.csb0(csb0_bank0),
|
||||
.web0(web0_bank0),
|
||||
.dout0(dout0_bank0)
|
||||
);
|
||||
sram_1bank bank1 (
|
||||
`ifdef USE_POWER_PINS
|
||||
.vdd(vdd),
|
||||
.gnd(gnd),
|
||||
`endif
|
||||
.clk0(clk0),
|
||||
.addr0(addr0[ADDR_WIDTH - BANK_SEL - 1 : 0]),
|
||||
.din0(din0),
|
||||
.csb0(csb0_bank1),
|
||||
.web0(web0_bank1),
|
||||
.dout0(dout0_bank1)
|
||||
);
|
||||
|
||||
always @(posedge clk0) begin
|
||||
addr0_reg <= addr0;
|
||||
end
|
||||
|
||||
always @(*) begin
|
||||
case (addr0_reg[ADDR_WIDTH - 1 : ADDR_WIDTH - BANK_SEL])
|
||||
0: begin
|
||||
dout0 = dout0_bank0;
|
||||
end
|
||||
1: begin
|
||||
dout0 = dout0_bank1;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
always @(*) begin
|
||||
csb0_bank0 = 1'b1;
|
||||
web0_bank0 = 1'b1;
|
||||
csb0_bank1 = 1'b1;
|
||||
web0_bank1 = 1'b1;
|
||||
case (addr0[ADDR_WIDTH - 1 : ADDR_WIDTH - BANK_SEL])
|
||||
0: begin
|
||||
web0_bank0 = web0;
|
||||
csb0_bank0 = csb0;
|
||||
end
|
||||
1: begin
|
||||
web0_bank1 = web0;
|
||||
csb0_bank1 = csb0;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
|
||||
endmodule
|
||||
Loading…
Reference in New Issue