拆分主站从站软件

This commit is contained in:
RuigeLee
2024-10-29 11:21:04 +08:00
parent 8068a31e77
commit 683b6cad92
7 changed files with 268 additions and 44 deletions

View File

@@ -60,44 +60,53 @@ test:
sw: sw:
# riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs \ riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs -mcmodel=medany -mexplicit-relocs \
# -I ./tb/sw/ -I ./tb/sw/src -I ./tb/sw/axi_gpio -I ./tb/sw/axi_uart -I ./tb/sw/axi_timer \ -I ./tb/sw/ -I ./tb/sw/src \
# -c ./tb/sw/src/main.c \ -c ./tb/sw/src/mstStartup.S \
# -o ./tb/sw/build/main.o -o ./tb/sw/build/mstStartup.o
# riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs \
# -I ./tb/sw/ -I ./tb/sw/src -I ./tb/sw/axi_gpio -I ./tb/sw/axi_uart -I ./tb/sw/axi_timer \
# -c ./tb/sw/axi_uart/uart.c \
# -o ./tb/sw/build/uart.o
riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs -mcmodel=medany -mexplicit-relocs \ riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs -mcmodel=medany -mexplicit-relocs \
-I ./tb/sw/ -I ./tb/sw/src \ -I ./tb/sw/ -I ./tb/sw/src \
-c ./tb/sw/src/startup.S \ -c ./tb/sw/src/mstMain.S \
-o ./tb/sw/build/startup.o -o ./tb/sw/build/mstMain.o
riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs -mcmodel=medany -mexplicit-relocs \
-I ./tb/sw/ -I ./tb/sw/src \
-c ./tb/sw/src/main.S \
-o ./tb/sw/build/main.o
riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs -nostdlib -nodefaultlibs -nostartfiles \ riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs -nostdlib -nodefaultlibs -nostartfiles \
-T ./tb/sw/linker.lds \ -T ./tb/sw/linker.lds \
./tb/sw/build/startup.o \ ./tb/sw/build/mstStartup.o \
./tb/sw/build/main.o \ ./tb/sw/build/mstMain.o \
-o ./tb/sw/build/test.elf -o ./tb/sw/build/mstTest.elf
riscv64-unknown-elf-objcopy -O binary ./tb/sw/build/test.elf ./tb/sw/build/test.bin riscv64-unknown-elf-objcopy -O binary ./tb/sw/build/mstTest.elf ./tb/sw/build/mstTest.bin
# riscv64-unknown-elf-objdump -h ./tb/sw/build/test.elf > ./tb/sw/build/test.dump riscv64-unknown-elf-objdump --disassemble-all --disassemble-zeroes --section=.text --section=.text.startup --section=.text.init --section=.data --section=.bss --section=.rodata --section=.trap_entry ./tb/sw/build/mstTest.elf > ./tb/sw/build/mstTest.dump
riscv64-unknown-elf-objdump --disassemble-all --disassemble-zeroes --section=.text --section=.text.startup --section=.text.init --section=.data --section=.bss --section=.rodata --section=.trap_entry ./tb/sw/build/test.elf > ./tb/sw/build/test.dump
riscv64-unknown-elf-objcopy -O verilog ./tb/sw/build/mstTest.elf ./tb/sw/build/mstTest.verilog
sed -i 's/@800/@000/g' ./tb/sw/build/mstTest.verilog
# riscv64-unknown-elf-objcopy --add-section .trap_entry=./tb/sw/build/test.bin ./tb/sw/build/test.elf ./tb/sw/build/test_with_section.elf riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs -mcmodel=medany -mexplicit-relocs \
-I ./tb/sw/ -I ./tb/sw/src \
# riscv64-unknown-elf-readelf -a ./tb/sw/build/test.elf -c ./tb/sw/src/slvStartup.S \
# riscv64-unknown-elf-objcopy --add-section .trap_entry=./tb/sw/build/test.bin ./tb/sw/build/test.elf ./tb/sw/build/test_with_section.elf -o ./tb/sw/build/slvStartup.o
riscv64-unknown-elf-objcopy -O verilog ./tb/sw/build/test.elf ./tb/sw/build/test.verilog
sed -i 's/@800/@000/g' ./tb/sw/build/test.verilog riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs -mcmodel=medany -mexplicit-relocs \
-I ./tb/sw/ -I ./tb/sw/src \
-c ./tb/sw/src/slvMain.S \
-o ./tb/sw/build/slvMain.o
riscv64-unknown-elf-gcc -Os -ggdb -march=rv32i -mabi=ilp32 -Wall -mcmodel=medany -mexplicit-relocs -nostdlib -nodefaultlibs -nostartfiles \
-T ./tb/sw/linker.lds \
./tb/sw/build/slvStartup.o \
./tb/sw/build/slvMain.o \
-o ./tb/sw/build/slvTest.elf
riscv64-unknown-elf-objcopy -O binary ./tb/sw/build/slvTest.elf ./tb/sw/build/slvTest.bin
riscv64-unknown-elf-objdump --disassemble-all --disassemble-zeroes --section=.text --section=.text.startup --section=.text.init --section=.data --section=.bss --section=.rodata --section=.trap_entry ./tb/sw/build/slvTest.elf > ./tb/sw/build/slvTest.dump
riscv64-unknown-elf-objcopy -O verilog ./tb/sw/build/slvTest.elf ./tb/sw/build/slvTest.verilog
sed -i 's/@800/@000/g' ./tb/sw/build/slvTest.verilog
fst: fst:
gtkwave ./tb/build/wave.fst & gtkwave ./tb/build/wave.fst &

View File

@@ -12,22 +12,87 @@ module backSys_TB (
reg overCLK; reg overCLK;
wire io_uDatIn; wire [3:0] io_uDat;
wire io_uDatOut; wire [3:0] io_dDat;
wire io_dDatIn;
wire io_dDatOut; wire [3:0] isLast;
BackSys s_BackSys( BackSys s_Mst(
.clock(clock), .clock(clock),
.reset(reset), .reset(reset),
.io_overCLK(overCLK), .io_overCLK(overCLK),
.io_uDatIn(io_uDatIn), .io_uDatIn(io_uDat[0]),
.io_uDatOut(io_uDatOut), .io_uDatOut(),
.io_dDatIn(io_dDatIn), .io_dDatIn(1'b0),
.io_dDatOut(io_dDatOut) .io_dDatOut(io_dDat[0]),
.io_out(),
.io_in(32'b0),
.io_isOnline(),
.io_isLast(isLast[0]),
.io_DCIn(1'b0)
); );
BackSys s_Slv0(
.clock(clock),
.reset(reset),
.io_overCLK(overCLK),
.io_uDatIn(io_uDat[1]),
.io_uDatOut(io_uDat[0]),
.io_dDatIn(io_dDat[0]),
.io_dDatOut(io_dDat[1]),
.io_out(),
.io_in(32'b0),
.io_isOnline(isLast[0]),
.io_isLast(isLast[1]),
.io_DCIn(1'b0)
);
BackSys s_Slv1(
.clock(clock),
.reset(reset),
.io_overCLK(overCLK),
.io_uDatIn(io_uDat[2]),
.io_uDatOut(io_uDat[1]),
.io_dDatIn(io_dDat[1]),
.io_dDatOut(io_dDat[2]),
.io_out(),
.io_in(32'b0),
.io_isOnline(isLast[1]),
.io_isLast(isLast[2]),
.io_DCIn(1'b0)
);
BackSys s_Slv2(
.clock(clock),
.reset(reset),
.io_overCLK(overCLK),
.io_uDatIn(io_uDat[3]),
.io_uDatOut(io_uDat[2]),
.io_dDatIn(io_dDat[2]),
.io_dDatOut(io_dDat[3]),
.io_out(),
.io_in(32'b0),
.io_isOnline(isLast[2]),
.io_isLast(isLast[3]),
.io_DCIn(1'b0)
);
BackSys s_Slv3(
.clock(clock),
.reset(reset),
.io_overCLK(overCLK),
.io_uDatIn(1'b0),
.io_uDatOut(io_uDat[3]),
.io_dDatIn(io_dDat[3]),
.io_dDatOut(),
.io_out(),
.io_in(32'b0),
.io_isOnline(isLast[3]),
.io_isLast(1'b1),
.io_DCIn(1'b0)
);
initial begin initial begin
@@ -54,18 +119,18 @@ initial begin
end end
`define SRAM0 s_BackSys.sram.mem_0 `define SRAM0 s_Mst.sram.mem_0
`define SRAM1 s_BackSys.sram.mem_1 `define SRAM1 s_Mst.sram.mem_1
`define SRAM2 s_BackSys.sram.mem_2 `define SRAM2 s_Mst.sram.mem_2
`define SRAM3 s_BackSys.sram.mem_3 `define SRAM3 s_Mst.sram.mem_3
localparam DP = 2**14; localparam DP = 2**14;
integer i, by; integer i;
reg [7:0] mem [0:200000]; reg [7:0] mem [0:200000];
initial begin initial begin
$readmemh("./tb/sw/build/test.verilog", mem); $readmemh("./tb/sw/build/mstTest.verilog", mem);
for ( i = 0; i < DP; i = i + 1 ) begin for ( i = 0; i < DP; i = i + 1 ) begin
`SRAM0[i] = | mem[i*4+0] ? mem[i*4+0]: 8'h0; `SRAM0[i] = | mem[i*4+0] ? mem[i*4+0]: 8'h0;
`SRAM1[i] = | mem[i*4+1] ? mem[i*4+1]: 8'h0; `SRAM1[i] = | mem[i*4+1] ? mem[i*4+1]: 8'h0;
@@ -74,10 +139,57 @@ end
// $display("ITCM %h: %h,%h", i*4,`SRAM_ODD.ram[i],`SRAM_EVE.ram[i]); // $display("ITCM %h: %h,%h", i*4,`SRAM_ODD.ram[i],`SRAM_EVE.ram[i]);
end end
end end
`define SLV0_SRAM0 s_Slv0.sram.mem_0
`define SLV0_SRAM1 s_Slv0.sram.mem_1
`define SLV0_SRAM2 s_Slv0.sram.mem_2
`define SLV0_SRAM3 s_Slv0.sram.mem_3
`define SLV1_SRAM0 s_Slv1.sram.mem_0
`define SLV1_SRAM1 s_Slv1.sram.mem_1
`define SLV1_SRAM2 s_Slv1.sram.mem_2
`define SLV1_SRAM3 s_Slv1.sram.mem_3
`define SLV2_SRAM0 s_Slv2.sram.mem_0
`define SLV2_SRAM1 s_Slv2.sram.mem_1
`define SLV2_SRAM2 s_Slv2.sram.mem_2
`define SLV2_SRAM3 s_Slv2.sram.mem_3
`define SLV3_SRAM0 s_Slv3.sram.mem_0
`define SLV3_SRAM1 s_Slv3.sram.mem_1
`define SLV3_SRAM2 s_Slv3.sram.mem_2
`define SLV3_SRAM3 s_Slv3.sram.mem_3
localparam DPS = 2**14;
reg [7:0] mem1 [0:200000];
initial begin
$readmemh("./tb/sw/build/slvTest.verilog", mem);
for ( i = 0; i < DP; i = i + 1 ) begin
`SLV0_SRAM0[i] = | mem[i*4+0] ? mem[i*4+0]: 8'h0;
`SLV0_SRAM1[i] = | mem[i*4+1] ? mem[i*4+1]: 8'h0;
`SLV0_SRAM2[i] = | mem[i*4+2] ? mem[i*4+2]: 8'h0;
`SLV0_SRAM3[i] = | mem[i*4+3] ? mem[i*4+3]: 8'h0;
`SLV1_SRAM0[i] = | mem[i*4+0] ? mem[i*4+0]: 8'h0;
`SLV1_SRAM1[i] = | mem[i*4+1] ? mem[i*4+1]: 8'h0;
`SLV1_SRAM2[i] = | mem[i*4+2] ? mem[i*4+2]: 8'h0;
`SLV1_SRAM3[i] = | mem[i*4+3] ? mem[i*4+3]: 8'h0;
`SLV2_SRAM0[i] = | mem[i*4+0] ? mem[i*4+0]: 8'h0;
`SLV2_SRAM1[i] = | mem[i*4+1] ? mem[i*4+1]: 8'h0;
`SLV2_SRAM2[i] = | mem[i*4+2] ? mem[i*4+2]: 8'h0;
`SLV2_SRAM3[i] = | mem[i*4+3] ? mem[i*4+3]: 8'h0;
`SLV3_SRAM0[i] = | mem[i*4+0] ? mem[i*4+0]: 8'h0;
`SLV3_SRAM1[i] = | mem[i*4+1] ? mem[i*4+1]: 8'h0;
`SLV3_SRAM2[i] = | mem[i*4+2] ? mem[i*4+2]: 8'h0;
`SLV3_SRAM3[i] = | mem[i*4+3] ? mem[i*4+3]: 8'h0;
// $display("ITCM %h: %h,%h", i*4,`SRAM_ODD.ram[i],`SRAM_EVE.ram[i]);
end
end
initial initial
begin begin

49
tb/sw/src/slvMain.S Normal file
View File

@@ -0,0 +1,49 @@
#define cdr_0_tx_status 0x40000000
#define cdr_0_tx_txLen 0x40000004
#define cdr_0_tx_txFifo 0x40000008
#define cdr_0_rx_softReset 0x40000010
#define cdr_0_rx_status 0x40000014
#define cdr_0_rx_rxLen 0x40000018
#define cdr_0_rx_rxFifo 0x4000001c
#define cdr_1_tx_status 0x40000080
#define cdr_1_tx_txLen 0x40000084
#define cdr_1_tx_txFifo 0x40000088
#define cdr_1_rx_softReset 0x40000090
#define cdr_1_rx_status 0x40000094
#define cdr_1_rx_rxLen 0x40000098
#define cdr_1_rx_rxFifo 0x4000009c
.global main
main:
lui x5, %hi(cdr_0_tx_status)
li x6, 128
sw x6, 4(x5) #cdr_0_tx_txLen
li x6, 32 #
1:
beqz x15, 3f # x1003
2:
li x15, 0 #
lw x7, 0(x5) # cdr_0_tx_status
andi x7, x7, 0x2 # 11
bnez x7, 2b # 102
3:
# cdr_0_tx_txFifo0x5532
sw x6, 8(x5) # cdr_0_tx_txFifo0x55
addi x6, x6, -1 #
bnez x6, 1b # 0
4:
j 4b

54
tb/sw/src/slvStartup.S Normal file
View File

@@ -0,0 +1,54 @@
#include "custom_ops.S"
.extern main
.globl _prog_start
.section .text.init
_prog_start:
li x15, 0
picorv32_maskirq_insn(zero, zero)
call main
li gp, 1;
ecall
.balign 32
.section .trap_entry, "ax", %progbits
trap_entry:
# q0 return address
# q1 bitmask of all IRQ to be handled, may be more than one IRQ
# q2 q3 unused, can be use as temp storage register
# q Without the q-registers, the irq return address will be stored in x3 (gp) and the IRQ bitmask in x4 (tp),
addi x15, x4, 0
picorv32_retirq_insn()