Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add more split bus tests #151

Merged
merged 3 commits into from
Dec 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions basil/utils/sim/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ def cocotb_makefile(sim_files, top_level='tb', test_module='basil.utils.sim.Test
mkfile += extra
mkfile += "\n"

try:
if os.environ['SIM'] == 'verilator':
mkfile += "EXTRA_ARGS += -DVERILATOR_SIM\n"
mkfile += "EXTRA_ARGS += -Wno-WIDTH -Wno-TIMESCALEMOD\n"
except KeyError:
pass

mkfile += """
export SIMULATION_HOST
export SIMULATION_PORT
Expand Down
15 changes: 13 additions & 2 deletions tests/test_SimFifo8to32.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,20 @@
"""


class TestSimM26(unittest.TestCase):
class TestSimFifo8to32(unittest.TestCase):
def __init__(self, testname, tb='test_SimFifo8to32.v', bus_drv='basil.utils.sim.BasilBusDriver', bus_split=False):
super(TestSimFifo8to32, self).__init__(testname)
self._test_tb = tb
self._sim_bus = bus_drv
self._bus_split_def = ()
if bus_split is not False:
if bus_split == 'sbus':
self._bus_split_def = ("BASIL_SBUS",)
elif bus_split == 'top':
self._bus_split_def = ("BASIL_TOPSBUS",)

def setUp(self):
cocotb_compile_and_run([os.path.join(os.path.dirname(__file__), 'test_SimFifo8to32.v')])
cocotb_compile_and_run(sim_files=[os.path.join(os.path.dirname(__file__), self._test_tb)], sim_bus=self._sim_bus, extra_defines=self._bus_split_def)

self.chip = Dut(cnfg_yaml)
self.chip.init()
Expand Down
53 changes: 51 additions & 2 deletions tests/test_SimFifo8to32.v
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@

`timescale 1ps / 1ps

`ifdef BASIL_SBUS
`define SPLIT_BUS
`elsif BASIL_TOPSBUS
`define SPLIT_BUS
`endif

`ifndef BASIL_SBUS
`include "utils/bus_to_ip.v"

`include "utils/cdc_syncfifo.v"
Expand All @@ -15,12 +22,20 @@

`include "bram_fifo/bram_fifo_core.v"
`include "bram_fifo/bram_fifo.v"
`else
$fatal("Sbus modules not implemented yet");
`endif

module tb (
input wire BUS_CLK,
input wire BUS_RST,
input wire [31:0] BUS_ADD,
inout wire [31:0] BUS_DATA,
`ifndef SPLIT_BUS
inout wire [31:0] BUS_DATA,
`else
input wire [31:0] BUS_DATA_IN,
output wire [31:0] BUS_DATA_OUT,
`endif
input wire BUS_RD,
input wire BUS_WR,
output wire BUS_BYTE_ACCESS
Expand All @@ -35,6 +50,16 @@ localparam FIFO_HIGHADDR_DATA = 32'h9000_0000-1;
localparam ABUSWIDTH = 32;
assign BUS_BYTE_ACCESS = BUS_ADD < 32'h8000_0000 ? 1'b1 : 1'b0;

// Connect tb internal bus to external split bus
`ifdef BASIL_TOPSBUS
wire [31:0] BUS_DATA;
assign BUS_DATA = BUS_DATA_IN;
assign BUS_DATA_OUT = BUS_DATA;
`elsif BASIL_SBUS
wire [31:0] BUS_DATA_OUT_1;
assign BUS_DATA_OUT = BUS_DATA_OUT_1;
`endif

wire FIFO_READ_RX;
wire FIFO_EMPTY_RX;
wire [31:0] FIFO_DATA_RX;
Expand All @@ -43,19 +68,32 @@ assign cdc_fifo_write = (BUS_ADD >= 32'h1000 && BUS_ADD < 32'h8000) & BUS_WR;

wire fifo_full, cdc_fifo_empty;
wire [7:0] cdc_data_out;

`ifndef BASIL_SBUS
cdc_syncfifo #(
`else
cdc_syncfifo_sbus #(
`endif
.DSIZE(8),
.ASIZE(3)
) cdc_syncfifo_i (
.rdata(cdc_data_out),
.wfull(),
.rempty(cdc_fifo_empty),
`ifndef BASIL_SBUS
.wdata(BUS_DATA),
`else
.wdata(BUS_DATA_IN),
`endif
.winc(cdc_fifo_write), .wclk(BUS_CLK), .wrst(BUS_RST),
.rinc(!fifo_full), .rclk(BUS_CLK), .rrst(BUS_RST)
);

`ifndef BASIL_SBUS
fifo_8_to_32 #(
`else
fifo_8_to_32_sbus #(
`endif
.DEPTH(1024)
) fifo_8_to_32_i (
.RST(BUS_RST),
Expand All @@ -68,10 +106,14 @@ fifo_8_to_32 #(
.DATA_OUT(FIFO_DATA)
);


wire FIFO_READ, FIFO_EMPTY;
wire [31:0] FIFO_DATA;

`ifndef BASIL_SBUS
bram_fifo #(
`else
bram_fifo_sbus #(
`endif
.BASEADDR(FIFO_BASEADDR),
.HIGHADDR(FIFO_HIGHADDR),
.BASEADDR_DATA(FIFO_BASEADDR_DATA),
Expand All @@ -81,7 +123,12 @@ bram_fifo #(
.BUS_CLK(BUS_CLK),
.BUS_RST(BUS_RST),
.BUS_ADD(BUS_ADD),
`ifndef BASIL_SBUS
.BUS_DATA(BUS_DATA),
`else
.BUS_DATA_IN(BUS_DATA_IN),
.BUS_DATA_OUT(BUS_DATA_OUT_1),
`endif
.BUS_RD(BUS_RD),
.BUS_WR(BUS_WR),

Expand All @@ -95,9 +142,11 @@ bram_fifo #(
.FIFO_READ_ERROR()
);

`ifndef VERILATOR_SIM
initial begin
$dumpfile("test_SimFifo8to32.vcd");
$dumpvars(0);
end
`endif

endmodule
28 changes: 28 additions & 0 deletions tests/test_SimFifo8to32_sbus.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#
# ------------------------------------------------------------
# Copyright (c) All rights reserved
# SiLab, Institute of Physics, University of Bonn
# ------------------------------------------------------------
#

import unittest
import sys

from tests.test_SimFifo8to32 import TestSimFifo8to32


if __name__ == '__main__':
# https://stackoverflow.com/a/2081750
test_loader = unittest.TestLoader()
test_names = test_loader.getTestCaseNames(TestSimFifo8to32)

suite = unittest.TestSuite()

# TODO: add sbus versions of used modules
# for test_name in test_names:
# suite.addTest(TestSimFifo8to32(testname=test_name, tb='test_SimFifo8to32.v', bus_drv='basil.utils.sim.BasilSbusDriver', bus_split='sbus'))
for test_name in test_names:
suite.addTest(TestSimFifo8to32(testname=test_name, tb='test_SimFifo8to32.v', bus_drv='basil.utils.sim.BasilSbusDriver', bus_split='top'))

result = unittest.TextTestRunner().run(suite)
sys.exit(not result.wasSuccessful())
12 changes: 9 additions & 3 deletions tests/test_SimGpio.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,19 @@


class TestSimGpio(unittest.TestCase):
def __init__(self, testname, tb='test_SimGpio.v', bus='basil.utils.sim.BasilBusDriver'):
def __init__(self, testname, tb='test_SimGpio.v', bus_drv='basil.utils.sim.BasilBusDriver', bus_split=False):
super(TestSimGpio, self).__init__(testname)
self._test_tb = tb
self._sim_bus = bus
self._sim_bus = bus_drv
self._bus_split_def = ()
if bus_split is not False:
if bus_split == 'sbus':
self._bus_split_def = ("BASIL_SBUS",)
elif bus_split == 'top':
self._bus_split_def = ("BASIL_TOPSBUS",)

def setUp(self):
cocotb_compile_and_run(sim_files=[os.path.join(os.path.dirname(__file__), self._test_tb)], sim_bus=self._sim_bus)
cocotb_compile_and_run(sim_files=[os.path.join(os.path.dirname(__file__), self._test_tb)], sim_bus=self._sim_bus, extra_defines=self._bus_split_def)

self.chip = Dut(cnfg_yaml)
self.chip.init()
Expand Down
62 changes: 56 additions & 6 deletions tests/test_SimGpio.v
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,31 @@

flooklab marked this conversation as resolved.
Show resolved Hide resolved
`timescale 1ps / 1ps

`include "utils/bus_to_ip.v"
`ifdef BASIL_SBUS
`define SPLIT_BUS
`elsif BASIL_TOPSBUS
`define SPLIT_BUS
`endif

`include "gpio/gpio_core.v"
`include "gpio/gpio.v"
`ifndef BASIL_SBUS
`include "utils/bus_to_ip.v"
`include "gpio/gpio.v"
`else
`include "utils/sbus_to_ip.v"
`include "gpio/gpio_sbus.v"
`endif

module tb (
input wire BUS_CLK,
input wire BUS_RST,
input wire [15:0] BUS_ADD,
`ifndef SPLIT_BUS
inout wire [7:0] BUS_DATA,
`else
input wire [7:0] BUS_DATA_IN,
output wire [7:0] BUS_DATA_OUT,
`endif
input wire BUS_RD,
input wire BUS_WR
);
Expand All @@ -26,9 +42,29 @@ localparam GPIO_HIGHADDR = 16'h000f;
localparam GPIO2_BASEADDR = 16'h0010;
localparam GPIO2_HIGHADDR = 16'h001f;

// Connect tb internal bus to external split bus
`ifdef BASIL_TOPSBUS
wire [7:0] BUS_DATA;
assign BUS_DATA = BUS_DATA_IN;
assign BUS_DATA_OUT = BUS_DATA;
`elsif BASIL_SBUS
wire [7:0] BUS_DATA_OUT_1;
wire [7:0] BUS_DATA_OUT_2;
assign BUS_DATA_OUT = BUS_DATA_OUT_1 | BUS_DATA_OUT_2;
`endif

/* verilator lint_off UNOPT */
wire [23:0] IO;

assign IO[15:8] = IO[7:0];
assign IO[23:20] = IO[19:16];
/* verilator lint_on UNOPT */

`ifndef BASIL_SBUS
gpio #(
`else
gpio_sbus #(
`endif
.BASEADDR(GPIO_BASEADDR),
.HIGHADDR(GPIO_HIGHADDR),
.IO_WIDTH(24),
Expand All @@ -38,17 +74,25 @@ gpio #(
.BUS_CLK(BUS_CLK),
.BUS_RST(BUS_RST),
.BUS_ADD(BUS_ADD),
`ifndef BASIL_SBUS
.BUS_DATA(BUS_DATA),
`else
.BUS_DATA_IN(BUS_DATA_IN),
.BUS_DATA_OUT(BUS_DATA_OUT_1),
`endif
.BUS_RD(BUS_RD),
.BUS_WR(BUS_WR),
.IO(IO)
);

assign IO[15:8] = IO[7:0];
assign IO[23:20] = IO[19:16];

wire [15:0] IO_2;
assign IO_2 = 16'ha5cd;

`ifndef BASIL_SBUS
gpio #(
`else
gpio_sbus #(
`endif
.BASEADDR(GPIO2_BASEADDR),
.HIGHADDR(GPIO2_HIGHADDR),
.IO_WIDTH(16),
Expand All @@ -57,16 +101,22 @@ gpio #(
.BUS_CLK(BUS_CLK),
.BUS_RST(BUS_RST),
.BUS_ADD(BUS_ADD),
`ifndef BASIL_SBUS
.BUS_DATA(BUS_DATA),
`else
.BUS_DATA_IN(BUS_DATA_IN),
.BUS_DATA_OUT(BUS_DATA_OUT_2),
`endif
.BUS_RD(BUS_RD),
.BUS_WR(BUS_WR),
.IO(IO_2)
);
assign IO_2 = 16'ha5cd;

`ifndef VERILATOR_SIM
initial begin
$dumpfile("gpio.vcd");
$dumpvars(0);
end
`endif

endmodule
4 changes: 2 additions & 2 deletions tests/test_SimGpio_sbus.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
suite = unittest.TestSuite()

for test_name in test_names:
suite.addTest(TestSimGpio(test_name, 'test_SimGpio_sbus.v', 'basil.utils.sim.BasilSbusDriver'))
suite.addTest(TestSimGpio(testname=test_name, tb='test_SimGpio.v', bus_drv='basil.utils.sim.BasilSbusDriver', bus_split='sbus'))
for test_name in test_names:
suite.addTest(TestSimGpio(test_name, 'test_SimGpio_sbus_top.v', 'basil.utils.sim.BasilSbusDriver'))
suite.addTest(TestSimGpio(testname=test_name, tb='test_SimGpio.v', bus_drv='basil.utils.sim.BasilSbusDriver', bus_split='top'))

result = unittest.TextTestRunner().run(suite)
sys.exit(not result.wasSuccessful())