拆分主站从站软件
This commit is contained in:
65
Makefile
65
Makefile
@@ -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 &
|
||||||
|
|||||||
144
tb/backSys_tb.v
144
tb/backSys_tb.v
@@ -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
49
tb/sw/src/slvMain.S
Normal 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 # 如果x10为0,则跳到3
|
||||||
|
2:
|
||||||
|
li x15, 0 # 清标志位
|
||||||
|
lw x7, 0(x5) # 读取cdr_0_tx_status的值
|
||||||
|
andi x7, x7, 0x2 # 检查第1比特(位1)
|
||||||
|
bnez x7, 2b # 如果第1比特不为0,则回到2处继续循环
|
||||||
|
|
||||||
|
3:
|
||||||
|
# 向cdr_0_tx_txFifo地址写入0x55,循环32次
|
||||||
|
sw x6, 8(x5) # 向cdr_0_tx_txFifo写入0x55
|
||||||
|
addi x6, x6, -1 # 递减计数器
|
||||||
|
bnez x6, 1b # 如果计数器不为0,则继续循环
|
||||||
|
|
||||||
|
4:
|
||||||
|
j 4b
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
54
tb/sw/src/slvStartup.S
Normal file
54
tb/sw/src/slvStartup.S
Normal 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()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user