From a1e389ecdc2398806bafb925a3afd1fe51988041 Mon Sep 17 00:00:00 2001 From: RuigeLee Date: Fri, 15 Nov 2024 14:35:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B1=87=E7=BC=96=E9=87=8D=E5=86=99=E4=BB=8E?= =?UTF-8?q?=E7=AB=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 1 + tb/sw/src/SlvMain.c | 206 +++++++++++++++++++++++++---------------- tb/sw/src/slvStartup.S | 5 + 3 files changed, 131 insertions(+), 81 deletions(-) diff --git a/Makefile b/Makefile index 0b25106..e3cd743 100644 --- a/Makefile +++ b/Makefile @@ -121,6 +121,7 @@ sw: sed -i 's/@800/@000/g' ./tb/sw/build/slvTest.verilog python3 ./tb/sw/bin_to_hex.py + python3 ./tb/sw/bin_to_coe.py fst: diff --git a/tb/sw/src/SlvMain.c b/tb/sw/src/SlvMain.c index 6f33a54..3347664 100644 --- a/tb/sw/src/SlvMain.c +++ b/tb/sw/src/SlvMain.c @@ -35,15 +35,18 @@ volatile uint32_t *ReadIsLast = (uint32_t*) ( 0x408); void main() { - uint32_t readDat; - uint32_t operator; - uint32_t downRecvLen; - uint32_t upRecvLen; + register uint32_t readDat; + register uint32_t operator; + register uint32_t downRecvLen; + register uint32_t upRecvLen; + uint32_t slvNum; uint32_t totNum; - uint32_t isLast; + register uint32_t isLast; + register uint32_t flag; + asm volatile ( "li sp, 0\n" @@ -52,13 +55,19 @@ void main() while(1){ - *cdr_softReset = 1; //复位脉冲 - isLast = *ReadIsLast; - *cdr_direct = 0; - *WriteGpio = 0x01; - register uint32_t flag; + asm volatile( + "sw x0, 0x10(x0)\n" //cdr_softReset 写入任意值进行复位//复位脉冲 + "lw %0, 0x408(x0)\n" //ReadIsLast 获取是否为最后一个从机 + "sw x0, 0xc(x0)\n" //设置CDR方向 + : "+r"(isLast) + ); - asm volatile ( + + + *WriteGpio = 0x01; + + //等待接收开始中断 + asm volatile ( "1:\n" "andi %0, sp, 0x04\n" "beqz %0, 1b\n" @@ -66,41 +75,55 @@ void main() : "+r"(flag) ); - readDat = *cdr_rxFifo; - operator = (readDat >> 16) & 0xf; - downRecvLen = readDat >> 20; - readDat = *cdr_rxFifo; + asm volatile ( + "lw %0, 0x1c(x0)\n" //read rxfifo + "srli %1, %0, 16\n" // operator = readDat >> 16 + "srli %2, %1, 4\n" // downRecvLen = operator >> 4 + "andi %1, %1,0xf\n" // operator = operator & 0xf + "lw %0, 0x1c(x0)\n" //read rxfifo + + : "+r"(readDat), "+r"(operator), "+r"(downRecvLen) + ); + *WriteGpio = 0x03; if( operator == 0 ){ - uint32_t localLen = 8; - uint32_t downSendLen = downRecvLen - 8; + //接收本地包 - for( uint32_t i = 0; i < 8/4; i++ ){ + for( uint32_t i = 0; i < 2; i++ ) { asm volatile ( "andi %0, sp, 0x08\n" "1:\n" "bnez %0, 1b\n" //error - : "+r"(flag) + "lw %1, 0x1c(x0)\n" //read rxfifo + : "+r"(flag), "+r"(readDat) ); - readDat = *cdr_rxFifo; } + + *WriteGpio = 0x07; - + register uint32_t downSendLen; + if(!isLast){ // 下行转发新建包头 - *cdr_txLen = downRecvLen; //downSendLen + 8 - *cdr_txFifo = (downSendLen << 20) |( 0 << 16) | 0; - *cdr_txFifo = 0; + register uint32_t downSendHead; + asm volatile ( + "sw %0, 0x4(x0)\n" // *cdr_txLen = downRecvLen + "addi %2, %0, -8\n" //downSendLen = downRecvLen - 8; + "slli %1, %2, 20\n" // downSendHead = (downSendLen << 20) |( 0 << 16) | 0; + "sw %1, 0x8(x0)\n" //*cdr_txFifo = downSendHead + "sw x0, 0x8(x0)\n" //*cdr_txFifo = 0 + : "+r"(downRecvLen), "+r"(downSendHead), "+r"(downSendLen) + ); //下行转发负载 - for( uint32_t i = 0; i < (downSendLen >> 2); i++ ){ //一次传4byte + for( uint32_t i = 0; i < (downSendLen); i+=4 ){ //一次传4byte register uint32_t forData; asm volatile ( "andi %0, sp, 0x08\n" @@ -108,9 +131,9 @@ void main() "bnez %0, 1b\n" //error 速度不够,不再检查接收 "lw %1, 0x01c(x0)\n" "sw %1, 0x008(x0)\n" - : "+r"(flag), "+r"(forData) - ); - //*cdr_0_tx_txFifo = *cdr_0_rx_rxFifo; //接收即发送 + : + "+r"(flag), "+r"(forData) + ); } } else{ //isLast @@ -121,23 +144,27 @@ void main() "andi %0, sp, 0x08\n" "1:\n" "bnez %0, 1b\n" //error 速度不够,不再检查接收 - // "lui t0, %hi(0x40000000)\n" "lw %1, 0x01c(x0)\n" : "+r"(flag), "+r"(forData) - ); } } *WriteGpio = 0x0f; - //CRC - asm volatile ( - "andi %0, sp, 0x08\n" - "1:\n" - "bnez %0, 1b\n" //error - :"+r"(flag) - ); - uint32_t crc = *cdr_rxFifo; //CRC + + //CRC + asm volatile ( + "andi %0, sp, 0x08\n" + "1:\n" + "bnez %0, 1b\n" //error + "lw %1, 0x1c(x0)\n" //read rxfifo + : "+r"(flag), "+r"(readDat) + ); + + + + + *WriteGpio = 0x1f; //等待接收完成标志 asm volatile ( @@ -147,7 +174,8 @@ void main() "andi sp, sp, 0xF7\n" : "+r"(flag) ); - *WriteGpio = 0x1f; + + *WriteGpio = 0x3f; if(!isLast){ //等待发送完成标志 @@ -160,21 +188,19 @@ void main() ); } - *WriteGpio = 0x3f; + *WriteGpio = 0x7f; + register uint32_t one = 1; + register uint32_t txLen; + register uint32_t txHeader; + asm volatile( + "sw x0, 0x10(x0)\n" //cdr_softReset 写入任意值进行复位//复位脉冲 + "sw %0, 0xc(x0)\n" //设置CDR方向 + : "+r"(one) + ); - - - - - - - - *cdr_softReset = 1; //复位脉冲 - *cdr_direct = 1; //方向转换 - if(!isLast){ //上行转发 @@ -187,43 +213,47 @@ void main() :"+r"(flag) ); - readDat = *cdr_rxFifo; - - - - // operator = (readDat >> 16) & 0xf; //速度不够,不校验 - upRecvLen = readDat >> 20; - - - - - - //发送上行包头 - *cdr_txLen = upRecvLen + 16; //upSendLen + 8 - *cdr_txFifo = ((upRecvLen + 8) << 20) |( 0 << 16) | 0; - *cdr_txFifo = 0; + asm volatile ( + "lw %0, 0x1c(x0)\n" //read rxfifo + "srli %1, %0, 20\n" // upRecvLen = readDat >> 20 + "addi %2, %1, 16\n" //txLen = upRecvLen + 16 + "addi %3, %1, 8\n" //txHeader = upRecvLen + 8 + "slli %3, %3, 20\n" //txHeader = txHeader << 20 |( 0 << 16) | 0 + "sw %2, 0x4(x0)\n" //*cdr_txLen = txLen + "sw %3, 0x8(x0)\n" //*cdr_txFifo = txHeader + "sw x0, 0x8(x0)\n" //*cdr_txFifo = 0 + + : "+r"(readDat), "+r"(upRecvLen), "+r"( txLen ), "+r"( txHeader ) + ); + + + for( uint32_t i = 0; i < 8/4; i ++ ){ - *cdr_txFifo = 0; + asm volatile ( + "sw x0, 0x8(x0)\n" //*cdr_txFifo = 0; + ); } //接收第二个包 - // asm volatile ( - // "andi %0, sp, 0x08\n" - // "1:\n" - // "bnez %0, 1b\n" //error //速度不够,不校验 - // :"+r"(flag) - // ); + asm volatile ( + "andi %0, sp, 0x08\n" + "1:\n" + "bnez %0, 1b\n" //error //速度不够,不校验 + "lw %1, 0x1c(x0)\n" //read rxfifo + :"+r"(flag), "+r"(readDat) + + ); + - uint32_t temp = *cdr_rxFifo; //上行转发负载 - for( uint32_t i = 0; i < (upRecvLen >> 2); i ++ ){ //一次传4byte + for( uint32_t i = 0; i < (upRecvLen); i += 4 ){ //一次传4byte register uint32_t forData; asm volatile ( "andi %0, sp, 0x80\n" @@ -234,7 +264,6 @@ void main() :"+r"(flag), "+r"(forData) ); - // *cdr_1_tx_txFifo = *cdr_1_rx_rxFifo; //接收即发送 } //CRC @@ -242,9 +271,10 @@ void main() "andi %0, sp, 0x08\n" "1:\n" "bnez %0, 1b\n" //error - :"+r"(flag) + "lw %0, 0x1c(x0)\n" //read rxfifo + :"+r"(flag), "+r"(readDat) ); - crc = *cdr_rxFifo; //CRC + //等待接收完成标志 asm volatile ( @@ -257,13 +287,27 @@ void main() totNum = slvNum + (upRecvLen >> 3) - 1; } else { //islast + + + //发送上行包头 - *cdr_txLen = 16; //upSendLen + 8 - *cdr_txFifo = (8 << 20) |( 0 << 16) | 0; - *cdr_txFifo = 0; + + + asm volatile ( + + "li %0, 16\n" //txLen = upRecvLen + 16 + "sw %0, 0x4(x0)\n" //*cdr_txLen = txLen + "lui %1, 0x800\n" //txHeader = 8 << 20 |( 0 << 16) | 0 + "sw %1, 0x8(x0)\n" //*cdr_txFifo = txHeader + "sw x0, 0x8(x0)\n" //*cdr_txFifo = 0 + + : "+r"( txLen ), "+r"( txHeader ) + ); for( uint32_t i = 0; i < 8/4; i ++ ){ - *cdr_txFifo = 0; + asm volatile ( + "sw x0, 0x8(x0)\n" //*cdr_txFifo = 0; + ); } diff --git a/tb/sw/src/slvStartup.S b/tb/sw/src/slvStartup.S index 55946a2..5fe6711 100644 --- a/tb/sw/src/slvStartup.S +++ b/tb/sw/src/slvStartup.S @@ -35,7 +35,12 @@ trap_entry: or sp, sp, x4 + andi x4, x4, 0x2 + beqz x4, 1f + li x4, 0 + sw x3, 0x400(x0) + 1: picorv32_retirq_insn()