diff --git a/rtl/ip/matmul/matmul_axi_slave.v b/rtl/ip/matmul/matmul_axi_slave.v index 7d17db4..81ca29c 100644 --- a/rtl/ip/matmul/matmul_axi_slave.v +++ b/rtl/ip/matmul/matmul_axi_slave.v @@ -2,7 +2,7 @@ // 3-stage pipelined multiplier (LUT-based, no DSP) // latency=3, throughput=1 result/cycle // ═══════════════════════════════════════════════════════ -(* use_dsp = "no" *) +(* use_dsp = "no", use_dsp48 = "no", syn_multstyle = "logic" *) module pipelined_mult_32x32 ( input clk, input rstn, @@ -11,7 +11,23 @@ module pipelined_mult_32x32 ( output reg [63:0] p ); reg [31:0] a_r, b_r; + (* use_dsp = "no", use_dsp48 = "no", syn_multstyle = "logic" *) reg [63:0] prod; + + function automatic [63:0] lut_mul32; + input [31:0] lhs; + input [31:0] rhs; + integer bit_idx; + reg [63:0] acc; + begin + acc = 64'b0; + for (bit_idx = 0; bit_idx < 32; bit_idx = bit_idx + 1) begin + if (rhs[bit_idx]) + acc = acc + ({32'b0, lhs} << bit_idx); + end + lut_mul32 = acc; + end + endfunction always @(posedge clk) begin if (!rstn) begin @@ -20,7 +36,7 @@ module pipelined_mult_32x32 ( end else begin a_r <= a; // Stage 1: register inputs b_r <= b; - prod <= a_r * b_r; // Stage 2: LUT-based multiply + prod <= lut_mul32(a_r, b_r); // Stage 2: LUT-based multiply p <= prod; // Stage 3: register output end end @@ -186,6 +202,8 @@ module matmul_axi_slave ( reg dma_done; reg [31:0] load_group; reg [31:0] store_group; + reg [31:0] dma_next_rd_addr; + reg [31:0] dma_next_wr_addr; reg [31:0] completed_groups; reg [1:0] bank_loaded; reg [1:0] bank_store_pending; @@ -880,6 +898,8 @@ module matmul_axi_slave ( dma_done <= 1'b0; load_group <= 32'd0; store_group <= 32'd0; + dma_next_rd_addr <= 32'd0; + dma_next_wr_addr <= 32'd0; completed_groups <= 32'd0; bank_loaded <= 2'b00; bank_store_pending <= 2'b00; @@ -933,6 +953,8 @@ module matmul_axi_slave ( dma_done <= 1'b0; load_group <= 32'd0; store_group <= 32'd0; + dma_next_rd_addr <= dma_src_base; + dma_next_wr_addr <= dma_dst_base; completed_groups <= 32'd0; bank_loaded <= 2'b00; bank_store_pending <= 2'b00; @@ -978,7 +1000,7 @@ module matmul_axi_slave ( !(state == C_RUN && cur_bank == dma_load_bank)) begin dma_rd_bank <= dma_load_bank; dma_rd_count <= 5'd0; - m_axi_araddr <= dma_src_base + (load_group * dma_src_stride); + m_axi_araddr <= dma_next_rd_addr; m_axi_arlen <= 8'd31; m_axi_arsize <= 3'd2; m_axi_arburst <= 2'b01; @@ -999,6 +1021,7 @@ module matmul_axi_slave ( m_axi_rready <= 1'b0; bank_loaded[dma_rd_bank] <= 1'b1; load_group <= load_group + 32'd1; + dma_next_rd_addr <= dma_next_rd_addr + dma_src_stride; dma_load_bank <= ~dma_load_bank; dma_rd_state <= DMA_RD_IDLE; end else begin @@ -1018,7 +1041,7 @@ module matmul_axi_slave ( dma_wr_count <= 6'd0; bank_store_pending[dma_store_bank] <= 1'b0; bank_storing[dma_store_bank] <= 1'b1; - m_axi_awaddr <= dma_dst_base + (store_group * dma_dst_stride); + m_axi_awaddr <= dma_next_wr_addr; m_axi_awlen <= 8'd47; m_axi_awsize <= 3'd2; m_axi_awburst <= 2'b01; @@ -1055,6 +1078,7 @@ module matmul_axi_slave ( bank_storing[dma_store_bank] <= 1'b0; dma_store_bank <= ~dma_store_bank; store_group <= store_group + 32'd1; + dma_next_wr_addr <= dma_next_wr_addr + dma_dst_stride; completed_groups <= completed_groups + 32'd1; if ((completed_groups + 32'd1) >= dma_groups) begin dma_busy <= 1'b0; diff --git a/sdk/axi_ram.mif b/sdk/axi_ram.mif index a511610..f4cb364 100644 --- a/sdk/axi_ram.mif +++ b/sdk/axi_ram.mif @@ -52,11 +52,11 @@ 00000011100000000110000000001101 00000100000000000000000110101100 00011100000000000000000000101100 -00000010101101001111000110001100 +00000010101010001011000110001100 00011100000000000001000000001101 00000010101111001001000110101101 00011100000000000001000000001110 -00000010101111011111000111001110 +00000010101111010111000111001110 01101100000000000001100110101110 00101000100000000000000110001111 00101001100000000000000110101111 @@ -64,9 +64,9 @@ 00000010100000000001000110101101 01101011111111111111000110101110 00011100000000000001000000001100 -00000010101111010111000110001100 +00000010101111001111000110001100 00011100000000000001000000001101 -00000010101111010101000110101101 +00000010101111001101000110101101 01101100000000000001000110001101 00101001100000000000000110000000 00000010100000000001000110001100 @@ -74,7 +74,7 @@ 00000011100000000110010000001100 00000100000001100000000000101100 00011100000000000001000000001100 -00000010101111001100000110001100 +00000010101111000001000110001100 00101000100000000000000110001101 00000011100000000001110000001110 00101001000000000000100110101110 @@ -94,7 +94,7 @@ 00000000000101010000000000001110 00101001000000000001000110101110 00011100000000000000000000001100 -00000010100011010001000110001100 +00000010100010100001000110001100 00000100000000000011000000101100 00000011100000000000010000001101 00000100000000010001000000101101 @@ -142,14 +142,11 @@ 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 -00000010101111111000000001100011 00010101011111100000000000010000 -00101001100000000111000001100001 -00101001100000000110000001110111 -00101001100000000101000001111000 +00000010101111111100000001100011 00000010100000010011010000001100 00011100000000000001000000001111 -00000010101101101010000111101111 +00000010101101101101000111101111 00000011100000000001011000001101 00101001100000000011000001101100 00101010000000000011000001101110 @@ -160,56 +157,43 @@ 00101001000000000000001000001110 00101000000000000000000111101100 01011111111111111110000110000000 -01010100000001100111100000000000 00010101011111101010000000001100 -00000011100000000100000110010001 -00101001100000000000001000100000 -00000010100000000101100000010000 +00000011100000000100000110001111 +00101001100000000000000111100000 +00000010100000000101100000010010 00000011100000000001000110001101 -00101001100000000000000110110000 -00010100001110001000000000001110 -00000011100000001000000110001111 -00101001100000000000000111101110 -00000011100101000000000111000101 -00000000000101010000000010011000 -00000011100000001001000110000100 -00101001100000000000000010000101 -00000011100000001010000110010011 -00000010100000000010100000010100 +00101001100000000000000110110010 +00010100001110001000000000010001 +00000011100000001000000110010000 +00010100001110001001001110001110 +00101001100000000000001000010001 +00000011100100000000000111001110 +00000011100000001001000110000101 +00010100000000000000000000101111 +00101001100000000000000010101110 +00000011100000001010000110000100 +00000011100011100010000111101111 +00101001100000000000000010001111 +00000011100000001011000110010011 +00000010100000100000000000010100 00101001100000000000001001110100 -00000011100000001011000110010001 -00000010100000100000000000010010 +00000011100000001100000110010001 +00000010100000110000000000010010 +00000010100001000000000000010000 00101001100000000000001000110010 -00000011100000001100000110001111 -00000010100000110000000000010000 -00000010100001000000000000001110 -00101001100000000000000111110000 -00010101011111101010000000010111 -00101001100000000000000110001110 +00010101011111101010000000001110 +00101001100000000000000110010000 00101000100000000000000110101100 00000011010000000100000110001100 01011011111111111111100110000000 -00000010100000000100000000001100 -00101001100000000000000110101100 -01010100000001011111110000000000 -00011100000000000001000000001101 -00000010101101010100000110101101 -00000011100000000100001011110111 -00101000100000000000000110110010 -00101000100000000000001011110001 -00010100000000000001111010001100 +00000010100000000100000000001111 +00101001100000000000000110101111 +00000011100000000100000111001110 +00101000100000000000000111010001 00010101011111100000000000010000 -00000011100010010000000110001110 -00000000000100010110000010000100 -00000000001000010011101001010011 -01011100000000000000100111000000 -00000000001010100000000000000111 00000010100000010011010000001100 -00000000001000010100110010010010 -01011100000000000000101001100000 -00000000001010100000000000000111 00011100000000000001000000001111 -00000010101100110010000111101111 +00000010101101000010000111101111 00000011100000000001011000001101 00101001100000000011000001101100 00101010000000000011000001101110 @@ -222,25 +206,25 @@ 01011111111111111110000110000000 00010101011111100000000000010000 00000010100000000111000000001110 -00000010100000000010010000010100 -00000010101111111111000000010011 +00000010100000000010010000010011 +00000010101111111111000000010010 00000011100000000001011000001101 00000011010000000000000000000000 00000000000101111011101000101100 00000011010000000011110110001100 00000010100000010101110110001111 -01101000000000000000101010001100 +01101000000000000000101001101100 00000010100000001100000110001111 00101010000000000000000110101100 00000011010000001000000110001100 01011011111111111111100110000000 00101001000000000000001000001111 00000010101111111111000111001110 -01011111111111111101100111010011 +01011111111111111101100111010010 00010101011111100000000000010000 00000010100000000011010000001100 00011100000000000001000000001111 -00000010101100010111000111101111 +00000010101100100111000111101111 00000011100000000001011000001101 00101001100000000011000001101100 00101010000000000011000001101110 @@ -252,44 +236,12 @@ 00101001000000000000001000001110 00101000000000000000000111101100 01011111111111111101110110000000 -01010100000000101100100000000000 -00010101011111100000000000010000 -00000010100000000011010000001100 -00011100000000000001000000001111 -00000010101100001100000111101111 -00000011100000000001011000001101 -00101001100000000011000001101100 -00101010000000000011000001101110 -00000010100000000000010111101111 -00000011010000000000000000000000 -00101010000000000000000110101100 -00000011010000001000000110001100 -01011011111111111111100110000000 -00101001000000000000001000001110 -00101000000000000000000111101100 -01011111111111111101110110000000 -00000000000101010000001001000100 -01010100000000101000010000000000 -00010101011111100000000000010000 -00000010100000000011010000001100 -00011100000000000001000000001111 -00000010101100000000000111101111 -00000011100000000001011000001101 -00101001100000000011000001101100 -00101010000000000011000001101110 -00000010100000000000010111101111 -00101010000000000000000110101100 -00000011010000001000000110001100 -01011011111111111111100110000000 -00101001000000000000001000001110 -00101000000000000000000111101100 -01011111111111111110000110000000 -00101000100000000111000001100001 -00101000100000000110000001110111 -00101000100000000101000001111000 00000000000101010000000000000100 -00000010100000001000000001100011 +00000010100000000100000001100011 01001100000000000000000000100000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 @@ -430,154 +382,6 @@ 00000011010000000000000000000000 00000011010000000000000000000000 00000011010000000000000000000000 -01011000000000100001010010000000 -00000010100000000010100000001100 -00000010101111111100000001100011 -00000000001000011011000010001101 -01011100000000000000100110000000 -00000000001010100000000000000111 -00000000001000010011000010010000 -01011100000000000000100110000000 -00000000001010100000000000000111 -00000010100000001100000110101101 -00000010100000000010010000001111 -00101001000000000001000001101101 -00000010100000000000010000001110 -01101100000000011010100111100100 -00000000001000011011001000001101 -01011100000000000000100110000000 -00000000001010100000000000000111 -00000010100000001100000110101101 -00000010100000011001000000001110 -00000010100000011000110000001111 -00000000001000010011100010010000 -01011100000000000000100111000000 -00000000001010100000000000000111 -00101001000000000001010001101101 -00000010100000000000100000001110 -01101100000000010111100111100100 -00000000001000011011001000001101 -01011100000000000000100110000000 -00000000001010100000000000000111 -00000010100000001100000110101101 -00000010100011111010000000001110 -00000010100011111001110000001111 -00000000001000010011100010010000 -01011100000000000000100111000000 -00000000001010100000000000000111 -00101001000000000001100001101101 -00000010100000000000110000001110 -01101100000000010100100111100100 -00010100000000000000000001001101 -00000000001000011011001000001111 -01011100000000000000100110000000 -00000000001010100000000000000111 -00000010100000001100000111101111 -00000011100111000100000110110000 -00101001000000000001110001101111 -00000000001000010100000010010001 -01011100000000000000101000000000 -00000000001010100000000000000111 -00000011100111000011110110101101 -00000010100000000001000000001110 -01101100000000010001010110100100 -00010100000000000000001100001101 -00000000001000011011001000101111 -01011100000000000000100110000000 -00000000001010100000000000000111 -00000010100000001100000111101111 -00000011100110101000000110110000 -00101001000000000010000001101111 -00000000001000010100000010010001 -01011100000000000000101000000000 -00000000001010100000000000000111 -00000011100110100111110110101101 -00000010100000000001010000001110 -01101100000000001110000110100100 -00010100000000000001111010001101 -00000000001000011011001000101111 -01011100000000000000100110000000 -00000000001010100000000000000111 -00000010100000001100000111101111 -00000011100010010000000110110000 -00101001000000000010010001101111 -00000000001000010100000010010001 -01011100000000000000101000000000 -00000000001010100000000000000111 -00000011100010001111110110101101 -00000010100000000001100000001110 -01101100000000001010110110100100 -00010100000000010011000100101101 -00000000001000011011001000101111 -01011100000000000000100110000000 -00000000001010100000000000000111 -00000010100000001100000111101111 -00000011100110100000000110110000 -00101001000000000010100001101111 -00000000001000010100000010010001 -01011100000000000000101000000000 -00000000001010100000000000000111 -00000011100110011111110110101101 -00000010100000000001110000001110 -01101100000000000111100110100100 -00010100000010111110101111001101 -00000000001000011011001000101111 -01011100000000000000100110000000 -00000000001010100000000000000111 -00000010100000001100000111101111 -00000011100001000000000110110000 -00101001000000000010110001101111 -00000000001000010100000010001111 -01011100000000000000101000000000 -00000000001010100000000000000111 -00000011100000111111110110101101 -00000010100000000010000000001110 -01101100000000000100010110100100 -00000000001000011011000111101110 -01011100000000000000100110000000 -00000000001010100000000000000111 -00010100011101110011010110001101 -00000010100000001100000111001100 -00000011101010000000000110101111 -00101001000000000011000001101100 -00000000001000010011110010001100 -01011100000000000000100111100000 -00000000001010100000000000000111 -00000011101001111111110110101101 -00000010100000000010010000001110 -01101100000000000001000110100100 -00000010100000001100000110001100 -00000010100000000010100000001110 -00101001000000000011010001101100 -00000010100000000001000001110001 -00010101011111100000000000010000 -00000000000100000011101000101110 -00000011100000000001011000001101 -00000011010000000000000000000000 -00101010001111111111110111001111 -00101010000000000000000110101100 -00000011010000001000000110001100 -01011011111111111111100110000000 -00101001000000000000001000001111 -00000010101111111111110111001110 -01011111111111111110101000101110 -00000010100000000100000001100011 -01001100000000000000000000100000 -00010101011111100000000000001110 -00000011100000000001010111001101 -00000011010000000000000000000000 -00101010000000000000000110101100 -00000011010000001000000110001100 -01011011111111111111100110000000 -00000010100000001100000000001100 -00101001000000000000000111001100 -01001100000000000000000000100000 -00000011010000000000000000000000 -00000011010000000000000000000000 -00000000000000000110000000000100 -01001100000000000000000000100000 -00000011010000000000000000000000 -00000011010000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 @@ -908,18 +712,10 @@ 00000000000000000000000000111101 01000001010011010000101000001101 01001100010101010100110101010100 -01000011010110010100001101011111 -00111101010100110100010101001100 -00000000000000000000000000000000 -01000001010011010000101000001101 -01001100010101010100110101010100 -01001101010010010101010001011111 -01010011010101010101111101000101 -00000000000000000000000000111101 -01000001010011010000101000001101 -01001100010101010100110101010100 01001110010011110100010001011111 00000000000010100000110101000101 -00000001111101111000101001000000 -10111111000000000000000000000000 10111111000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 diff --git a/sdk/software/examples/asm/user-sample.c b/sdk/software/examples/asm/user-sample.c index 1a1d38e..72f4152 100644 --- a/sdk/software/examples/asm/user-sample.c +++ b/sdk/software/examples/asm/user-sample.c @@ -5,7 +5,6 @@ */ #include -#include /* ─── UART 16550 direct access (bypasses slow printf/picolibc) ──────── */ #define UART_THR (*(volatile unsigned char *)0xbf000000) @@ -29,24 +28,6 @@ static void uart_puthex(unsigned int val) { } } -static void uart_putdec(unsigned int val) { - char buf[10]; - int i = 0; - - if (val == 0) { - uart_tx('0'); - return; - } - - while (val != 0) { - buf[i++] = (char)('0' + (val % 10)); - val /= 10; - } - while (i > 0) { - uart_tx((unsigned char)buf[--i]); - } -} - /* ─── Configurable group count (default 5000) ──────────────────────── */ #ifndef MATMUL_GROUP_NUM #define MATMUL_GROUP_NUM 5000 @@ -54,9 +35,6 @@ static void uart_putdec(unsigned int val) { /* ─── BSP globals ─────────────────────────────────────────────────── */ unsigned long UART_BASE = 0xbf000000; -unsigned long CONFREG_TIMER_BASE = 0xbf20f100; -unsigned long CONFREG_CLOCKS_PER_SEC = 50000000L; -unsigned long CORE_CLOCKS_PER_SEC = 33000000L; /* ─── Memory layout ────────────────────────────────────────────────── */ #define EXTRAM_BASE_PHYS 0x1c400000 @@ -107,11 +85,9 @@ int main(void) volatile unsigned int *mat_crc = (volatile unsigned int *)MATMUL_CRC; unsigned int crc; - unsigned int cycle_start, cycle_end, cycles, time_us; /* ── Start marker (must be first output) ──────────────────── */ uart_puts("MATMUL_START\r\n"); - cycle_start = get_clock_count(); *(volatile unsigned int *)MATMUL_CRC = 0; *mat_status = STATUS_DMA_DONE | STATUS_DONE | STATUS_ERROR; @@ -123,19 +99,12 @@ int main(void) *mat_ctrl = CTRL_DMA_START; while (!(*mat_status & STATUS_DMA_DONE)) {} *mat_status = STATUS_DMA_DONE; - cycle_end = get_clock_count(); - cycles = cycle_end - cycle_start; - time_us = cycles / (CORE_CLOCKS_PER_SEC / 1000000UL); /* ── Read hardware CRC32 ──────────────────────────────────── */ crc = *mat_crc; uart_puts("MATMUL_CRC32="); uart_puthex(crc); - uart_puts("\r\nMATMUL_CYCLES="); - uart_putdec(cycles); - uart_puts("\r\nMATMUL_TIME_US="); - uart_putdec(time_us); uart_puts("\r\nMATMUL_DONE\r\n"); return 0;