add bus_tb, has nearly all of manta end-to-end

This commit is contained in:
Fischer Moseley 2023-02-28 19:11:58 -05:00
parent c1620871cf
commit 5454ed37e9
6 changed files with 286 additions and 115 deletions

View File

@ -3,7 +3,6 @@
module bridge_rx(
input wire clk,
input wire rst,
input wire[7:0] axiid,
input wire axiiv,

View File

@ -19,43 +19,26 @@ module lut_mem(
output reg valid_o
);
parameter DEPTH = 8;
parameter BASE_ADDR = 0;
reg [DEPTH-1:0][15:0] mem;
reg [15:0] addr_ppln;
reg [15:0] wdata_ppln;
reg [15:0] rdata_ppln;
reg rw_ppln;
reg valid_ppln;
always @(posedge clk) begin
// pipeline stage 1
addr_ppln <= addr_i;
wdata_ppln <= wdata_i;
rdata_ppln <= rdata_i;
rw_ppln <= rw_i;
valid_ppln <= valid_i;
// pipeline stage 2
addr_o <= addr_ppln;
wdata_o <= wdata_ppln;
rdata_o <= rdata_ppln;
rw_o <= rw_ppln;
valid_o <= valid_ppln;
addr_o <= addr_i;
wdata_o <= wdata_i;
rdata_o <= rdata_i;
rw_o <= rw_i;
valid_o <= valid_i;
rdata_o <= rdata_i;
if(valid_i) begin
// write to memory
// check if address is valid
if( (addr_i >= BASE_ADDR) && (addr_i <= BASE_ADDR + DEPTH - 1) ) begin
// write to mem
// read/write
if (rw_i) mem[addr_i - BASE_ADDR] <= wdata_i;
// read from mem
else rdata_ppln <= mem[addr_i - BASE_ADDR];
else rdata_o <= mem[addr_i - BASE_ADDR];
end
end
end

78
test/bus.gtkw Normal file
View File

@ -0,0 +1,78 @@
[*]
[*] GTKWave Analyzer v3.3.107 (w)1999-2020 BSI
[*] Tue Feb 28 23:56:47 2023
[*]
[dumpfile] "/Users/fischerm/fpga/manta/bus.vcd"
[dumpfile_mtime] "Tue Feb 28 23:52:25 2023"
[dumpfile_size] 6844
[savefile] "/Users/fischerm/fpga/manta/bus.gtkw"
[timestart] 18600000000000
[size] 1710 994
[pos] -1 -1
*-46.201744 327700000000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
[treeopen] bus_tb.
[sst_width] 353
[signals_width] 276
[sst_expanded] 1
[sst_vpaned_height] 296
@28
bus_tb.clk
bus_tb.rst
@420
bus_tb.test_num
@200
-
-
-tb --> bridge_rx
@820
bus_tb.tb_brx_axid[7:0]
@28
bus_tb.tb_brx_axiv
@200
-
-
-bridge_rx --> mem_1
@22
bus_tb.brx_mem_1_addr[15:0]
bus_tb.brx_mem_1_rdata[15:0]
bus_tb.brx_mem_1_wdata[15:0]
@28
bus_tb.brx_mem_1_rw
bus_tb.brx_mem_1_valid
@200
-
-
-mem_1 --> mem_2
@22
bus_tb.mem_1_mem_2_addr[15:0]
bus_tb.mem_1_mem_2_rdata[15:0]
bus_tb.mem_1_mem_2_wdata[15:0]
@28
bus_tb.mem_1_mem_2_rw
bus_tb.mem_1_mem_2_valid
@200
-
-
-mem_2 --> mem_3
@22
bus_tb.mem_2_mem_3_addr[15:0]
bus_tb.mem_2_mem_3_rdata[15:0]
@28
bus_tb.mem_2_mem_3_rw
bus_tb.mem_2_mem_3_valid
@22
bus_tb.mem_2_mem_3_wdata[15:0]
@200
-
-
-mem_3 --> tb
@22
bus_tb.mem_3_tb_addr[15:0]
bus_tb.mem_3_tb_rdata[15:0]
@23
bus_tb.mem_3_tb_wdata[15:0]
@28
bus_tb.mem_3_tb_rw
bus_tb.mem_3_tb_valid
[pattern_trace] 1
[pattern_trace] 0

View File

@ -1,106 +1,215 @@
`default_nettype none
`timescale 1ns/1ps
`define CP 10
`define HCP 5
`define SEND_MESSAGE(MESSAGE) \
tb_brx_axiv = 1; \
for(int i=0; i < $size(MESSAGE); i++) begin \
tb_brx_axid = MESSAGE[i]; \
#`CP; \
end \
tb_brx_axiv = 0; \
module bus_tb;
// https://www.youtube.com/watch?v=WCOAr-96bGc
// https://www.youtube.com/watch?v=WCOAr-96bGc
//boilerplate
logic clk;
logic rst;
//boilerplate
logic clk;
logic rst;
integer test_num;
string message;
// uart inputs and outputs
logic rxd;
logic [7:0] uart_rx_axiod;
logic uart_rx_axiov;
// tb --> bridge_rx signals
logic [7:0] tb_brx_axid;
logic tb_brx_axiv;
logic txd;
logic [7:0] uart_tx_axiid;
logic uart_tx_axiiv;
logic uart_tx_axiir;
bridge_rx brx (
.clk(clk),
.axiid(tb_brx_axid),
.axiiv(tb_brx_axiv),
.req_addr(brx_mem_1_addr),
.req_data(brx_mem_1_wdata),
.req_rw(brx_mem_1_rw),
.req_valid(brx_mem_1_valid),
.req_ready(1'b1));
// the parameter will all get filled out in manta's big instantiator thing hehehee
parameter ADDR_WIDTH = 0; // $clog2( how much memory we need rounded up to the nearest 8 )
parameter DATA_WIDTH = 0;
// bridge_rx --> mem_1 signals
logic [15:0] brx_mem_1_addr;
logic [15:0] brx_mem_1_wdata;
logic [15:0] brx_mem_1_rdata;
logic brx_mem_1_rw;
logic brx_mem_1_valid;
// request bus, gets connected to uart_rx (through a FSM)
logic [ADDR_WIDTH-1:0] req_addr;
logic [DATA_WIDTH-1:0] req_data;
logic req_rw;
logic req_valid;
logic req_ready;
assign brx_mem_1_rdata = 0;
// response bus, get connected to uart_tx (through a FSM, but the data's there in spirit)
logic res_valid;
logic res_ready;
logic res_data;
lut_mem #(
.DEPTH(8),
.BASE_ADDR(0)
) mem_1 (
.clk(clk),
.addr_i(brx_mem_1_addr),
.wdata_i(brx_mem_1_wdata),
.rdata_i(brx_mem_1_rdata),
.rw_i(brx_mem_1_rw),
.valid_i(brx_mem_1_valid),
uart_rx #(
.DATA_WDITH(8),
.CLK_FREQ_HZ(100_000_000),
.BAUDRATE(115200))
uart_rx_uut (
.clk(clk),
.rst(rst),
.rxd(rxd),
.addr_o(mem_1_mem_2_addr),
.wdata_o(mem_1_mem_2_wdata),
.rdata_o(mem_1_mem_2_rdata),
.rw_o(mem_1_mem_2_rw),
.valid_o(mem_1_mem_2_valid));
.axiod(uart_rx_axiod),
.axiov(uart_rx_axiov));
// mem_1 --> mem_2 signals
logic [15:0] mem_1_mem_2_addr;
logic [15:0] mem_1_mem_2_wdata;
logic [15:0] mem_1_mem_2_rdata;
logic mem_1_mem_2_rw;
logic mem_1_mem_2_valid;
uart_tx #(
.DATA_WDITH(8),
.CLK_FREQ_HZ(100_000_000),
.BAUDRATE(115200))
uart_tx_uut (
.clk(clk),
.rst(rst),
.txd(txd),
lut_mem #(
.DEPTH(8),
.BASE_ADDR(8)
) mem_2 (
.clk(clk),
.addr_i(mem_1_mem_2_addr),
.wdata_i(mem_1_mem_2_wdata),
.rdata_i(mem_1_mem_2_rdata),
.rw_i(mem_1_mem_2_rw),
.valid_i(mem_1_mem_2_valid),
.axiid(uart_tx_axiid),
.axiiv(uart_tx_axiiv),
.axiir(uart_tx_axiir));
.addr_o(mem_2_mem_3_addr),
.wdata_o(mem_2_mem_3_wdata),
.rdata_o(mem_2_mem_3_rdata),
.rw_o(mem_2_mem_3_rw),
.valid_o(mem_2_mem_3_valid));
bridge_rx bridge_rx_uut(
.clk(clk),
.rst(rst),
// mem_2 --> mem_3 signals
logic [15:0] mem_2_mem_3_addr;
logic [15:0] mem_2_mem_3_wdata;
logic [15:0] mem_2_mem_3_rdata;
logic mem_2_mem_3_rw;
logic mem_2_mem_3_valid;
// connect to uart_rx
.axiid(uart_rx_axiod),
.axiiv(uart_rx_axiov),
lut_mem #(
.DEPTH(8),
.BASE_ADDR(16)
) mem_3 (
.clk(clk),
.addr_i(mem_2_mem_3_addr),
.wdata_i(mem_2_mem_3_wdata),
.rdata_i(mem_2_mem_3_rdata),
.rw_i(mem_2_mem_3_rw),
.valid_i(mem_2_mem_3_valid),
.addr_o(mem_3_btx_addr),
.wdata_o(mem_3_btx_wdata),
.rdata_o(mem_3_btx_rdata),
.rw_o(mem_3_btx_rw),
.valid_o(mem_3_btx_valid));
// mem_3 --> bridge_tx signals
logic [15:0] mem_3_btx_addr;
logic [15:0] mem_3_btx_wdata;
logic [15:0] mem_3_btx_rdata;
logic mem_3_btx_rw;
logic mem_3_btx_valid;
.req_addr(req_addr),
.req_data(req_data),
.req_rw(req_rw),
.req_valid(req_valid),
.req_ready(req_ready));
bridge_tx btx (
.clk(clk),
.axiod(btx_utx_axid),
.axiov(btx_utx_axiv),
.axior(btx_utx_axir),
bridge_tx bridge_tx_uut(
.clk(clk),
.rst(rst),
.res_data(mem_3_btx_rdata),
.res_valid(mem_3_btx_valid),
.res_ready());
// connect to uart_tx
.axiod(uart_tx_axiid),
.axiov(uart_tx_axiiv),
.axior(uart_tx_axiir),
.res_valid(res_valid),
.res_ready(res_ready),
.res_data(res_data));
// bridge_tx --> uart_tx signals
logic [7:0] btx_utx_axid;
logic btx_utx_axiv;
logic btx_utx_axir;
always begin
#5;
clk = !clk;
end
uart_tx #(
.DATA_WIDTH(8),
.CLK_FREQ_HZ(100_000_000),
.BAUDRATE(10_000_000)
) utx (
.clk(clk),
.rst(rst),
initial begin
$dumpfile("bus.vcd");
$dumpvars(0, bus_tb);
.axiid(btx_utx_axid),
.axiiv(btx_utx_axiv),
.axiir(btx_utx_axir),
.txd(utx_tb_txd));
// utx --> tb signals
logic utx_tb_txd;
end
always begin
#`HCP
clk = !clk;
end
initial begin
$dumpfile("bus.vcd");
$dumpvars(0, bus_tb);
// setup and reset
clk = 0;
rst = 0;
tb_brx_axid = 0;
tb_brx_axiv = 0;
test_num = 0;
#`CP
rst = 1;
#`CP
rst = 0;
#`HCP
// throw some nonzero data in the memories just so we know that we're pulling from the right ones
mem_1.mem[0] = 16'h0000;
mem_1.mem[1] = 16'h0001;
mem_1.mem[2] = 16'h0002;
mem_1.mem[3] = 16'h0003;
mem_1.mem[4] = 16'h0004;
mem_1.mem[5] = 16'h0005;
mem_1.mem[6] = 16'h0006;
mem_1.mem[7] = 16'h0007;
mem_2.mem[0] = 16'h0008;
mem_2.mem[1] = 16'h0009;
mem_2.mem[2] = 16'h000A;
mem_2.mem[3] = 16'h000B;
mem_2.mem[4] = 16'h000C;
mem_2.mem[5] = 16'h000D;
mem_2.mem[6] = 16'h000E;
mem_2.mem[7] = 16'h000F;
mem_3.mem[0] = 16'h0010;
mem_3.mem[1] = 16'h0011;
mem_3.mem[2] = 16'h0012;
mem_3.mem[3] = 16'h0013;
mem_3.mem[4] = 16'h0014;
mem_3.mem[5] = 16'h0015;
mem_3.mem[6] = 16'h0016;
mem_3.mem[7] = 16'h0017;
#(10*`CP);
/* ==== Test 1 Begin ==== */
$display("\n=== test 1: read from 0x0001 for baseline functionality ===");
test_num = 1;
#(10*`CP);
/* ==== Test 1 End ==== */
message = {"M12345678", 8'h0D, 8'h0A};
`SEND_MESSAGE(message)
#(1000*`CP)
$finish();
end
endmodule
`default_nettype wire

View File

@ -1,26 +1,28 @@
[*]
[*] GTKWave Analyzer v3.3.107 (w)1999-2020 BSI
[*] Tue Feb 28 22:40:21 2023
[*] Tue Feb 28 23:16:04 2023
[*]
[dumpfile] "/Users/fischerm/fpga/manta/lut_mem.vcd"
[dumpfile_mtime] "Tue Feb 28 22:39:27 2023"
[dumpfile_size] 5116
[dumpfile_mtime] "Tue Feb 28 23:14:40 2023"
[dumpfile_size] 5873
[savefile] "/Users/fischerm/fpga/manta/lut_mem.gtkw"
[timestart] 0
[timestart] 96500000000000
[size] 1710 994
[pos] -1 -1
*-45.675117 63700000000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
*-46.420933 115000000000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
[treeopen] lut_mem_tb.
[sst_width] 193
[signals_width] 308
[signals_width] 517
[sst_expanded] 1
[sst_vpaned_height] 305
@28
lut_mem_tb.clk
@420
lut_mem_tb.test_num
@200
-
-tb --> mem_1
@28
@29
lut_mem_tb.tb_mem_1_valid
@22
lut_mem_tb.tb_mem_1_addr[15:0]

View File

@ -192,7 +192,7 @@ module lut_mem_tb;
$display("\n=== test 4: read from 0x0012 for baseline functionality ===");
test_num = 4;
tb_mem_1_addr = 16'h0012;
tb_mem_1_addr = 16'h000A;
tb_mem_1_valid = 1;
tb_mem_1_rw = 0;
#`CP;