diff --git a/hw/ip/pdm2pcm/tb/pdm_core_tb.sv b/hw/ip/pdm2pcm/tb/pdm_core_tb.sv index 17fcfe1b3..03360e84a 100644 --- a/hw/ip/pdm2pcm/tb/pdm_core_tb.sv +++ b/hw/ip/pdm2pcm/tb/pdm_core_tb.sv @@ -40,10 +40,9 @@ module pdm_core_tb; end fpcm = $fopen("signals/pcm.txt", "w"); - if (fpcm) begin - $display("PCM File opened successfully."); - end else begin + if (!fpcm) begin $display("Failed to open PCM file."); + $stop(); end rstn_i = 0; diff --git a/hw/ip/soc_ctrl/rtl/soc_ctrl_reg_top.sv b/hw/ip/soc_ctrl/rtl/soc_ctrl_reg_top.sv index 7924221d4..b7cf0496e 100644 --- a/hw/ip/soc_ctrl/rtl/soc_ctrl_reg_top.sv +++ b/hw/ip/soc_ctrl/rtl/soc_ctrl_reg_top.sv @@ -12,8 +12,8 @@ module soc_ctrl_reg_top #( parameter type reg_rsp_t = logic, parameter int AW = 5 ) ( - input clk_i, - input rst_ni, + input logic clk_i, + input logic rst_ni, input reg_req_t reg_req_i, output reg_rsp_t reg_rsp_o, // To HW @@ -413,3 +413,54 @@ module soc_ctrl_reg_top #( `ASSERT(en2addrHit, (reg_we || reg_re) |-> $onehot0(addr_hit)) endmodule + +module soc_ctrl_reg_top_intf #( + parameter int AW = 5, + localparam int DW = 32 +) ( + input logic clk_i, + input logic rst_ni, + REG_BUS.in regbus_slave, + // To HW + output soc_ctrl_reg_pkg::soc_ctrl_reg2hw_t reg2hw, // Write + input soc_ctrl_reg_pkg::soc_ctrl_hw2reg_t hw2reg, // Read + // Config + input devmode_i // If 1, explicit error return for unmapped register access +); + localparam int unsigned STRB_WIDTH = DW / 8; + + `include "register_interface/typedef.svh" + `include "register_interface/assign.svh" + + // Define structs for reg_bus + typedef logic [AW-1:0] addr_t; + typedef logic [DW-1:0] data_t; + typedef logic [STRB_WIDTH-1:0] strb_t; + `REG_BUS_TYPEDEF_ALL(reg_bus, addr_t, data_t, strb_t) + + reg_bus_req_t s_reg_req; + reg_bus_rsp_t s_reg_rsp; + + // Assign SV interface to structs + `REG_BUS_ASSIGN_TO_REQ(s_reg_req, regbus_slave) + `REG_BUS_ASSIGN_FROM_RSP(regbus_slave, s_reg_rsp) + + + + soc_ctrl_reg_top #( + .reg_req_t(reg_bus_req_t), + .reg_rsp_t(reg_bus_rsp_t), + .AW(AW) + ) i_regs ( + .clk_i, + .rst_ni, + .reg_req_i(s_reg_req), + .reg_rsp_o(s_reg_rsp), + .reg2hw, // Write + .hw2reg, // Read + .devmode_i + ); + +endmodule + + diff --git a/hw/ip_examples/pdm2pcm_dummy/rtl/pdm2pcm_dummy.sv b/hw/ip_examples/pdm2pcm_dummy/rtl/pdm2pcm_dummy.sv index 4e9b80781..376b98344 100644 --- a/hw/ip_examples/pdm2pcm_dummy/rtl/pdm2pcm_dummy.sv +++ b/hw/ip_examples/pdm2pcm_dummy/rtl/pdm2pcm_dummy.sv @@ -35,9 +35,7 @@ module pdm2pcm_dummy #( init = 1; lineidx = 0; fpdm = $fopen(filepath, "r"); - if (fpdm) begin - $display("PDM File opened successfully."); - end else begin + if (!fpdm) begin $display("Failed to open PDM file."); $display(" > Please check if this the simulation was launched using"); $display(" `make *-sim` or `make run-pdm2pcm`."); diff --git a/sw/applications/example_dma/main.c b/sw/applications/example_dma/main.c index ccb970c89..94b1576fd 100644 --- a/sw/applications/example_dma/main.c +++ b/sw/applications/example_dma/main.c @@ -153,7 +153,7 @@ int main(int argc, char *argv[]) PRINTF("DMA single mode success.\n\r"); } else { PRINTF("DMA single mode failure: %d errors out of %d bytes checked\n\r", errors, trans.size_b ); - return -1; + return EXIT_FAILURE; } #endif // TEST_SINGULAR_MODE @@ -203,7 +203,7 @@ int main(int argc, char *argv[]) PRINTF("DMA address mode success.\n\r"); } else { PRINTF("DMA address mode failure: %d errors out of %d bytes checked\n\r", errors, trans.size_b ); - return -1; + return EXIT_FAILURE; } trans.mode = DMA_TRANS_MODE_SINGLE; @@ -270,7 +270,7 @@ int main(int argc, char *argv[]) PRINTF("DMA address mode in external memory success.\n\r"); } else { PRINTF("DMA address mode in external memory failure: %d errors out of %d bytes checked\n\r", errors, trans.size_b ); - return -1; + return EXIT_FAILURE; } trans.mode = DMA_TRANS_MODE_SINGLE; @@ -335,7 +335,7 @@ int main(int argc, char *argv[]) PRINTF("DMA multiple transactions success.\n\r"); } else { PRINTF("DMA multiple transactions failure: %d errors out of %d words checked\n\r", errors, TEST_DATA_SIZE); - return -1; + return EXIT_FAILURE; } #endif // TEST_PENDING_TRANSACTION @@ -394,7 +394,7 @@ int main(int argc, char *argv[]) PRINTF("DMA window success\n\r"); } else { PRINTF("DMA window failure: %d errors out of %d words checked\n\r", errors, TEST_DATA_SIZE); - return -1; + return EXIT_FAILURE; } #endif // TEST_WINDOW diff --git a/sw/applications/example_matfadd/main.c b/sw/applications/example_matfadd/main.c index f5213fffd..5b1a14fa2 100644 --- a/sw/applications/example_matfadd/main.c +++ b/sw/applications/example_matfadd/main.c @@ -6,6 +6,7 @@ #include #include "csr.h" #include "matrixAdd32.h" +#include #define FS_INITIAL 0x01 @@ -30,6 +31,90 @@ uint32_t check_results(float * C, int N, int M); float m_c[HEIGHT*WIDTH]; +void swap(char *a, char *b) +{ + char temp = *a; + *a = *b; + *b = temp; +} + +// A function to print a floating point number using putchar +void putfloat(float x, int p) +{ + // Check if x is negative + if (x < 0) + { + // Print a minus sign + putchar('-'); + // Make x positive + x = -x; + } + + // Convert the integer part of x into a string of digits + long i = (long)x; // Get the integer part + char int_str[20]; // An array to store the digits + int len = 0; // The length of the string + do + { + // Get the last digit and store it in the array + int_str[len] = '0' + i % 10; + len++; + // Remove the last digit from i + i /= 10; + } while (i > 0); + + // Reverse the string of digits + for (int j = 0; j < len / 2; j++) + { + // Swap the elements at both ends + swap(&int_str[j], &int_str[len - 1 - j]); + } + + // Print the string of digits + for (int j = 0; j < len; j++) + { + putchar(int_str[j]); + } + + // Print a decimal point + putchar('.'); + + // Convert the fractional part of x into a string of digits + float f = x - (long)x; // Get the fractional part + char frac_str[20]; // An array to store the digits + len = 0; // The length of the string + while (p--) + { + // Get the first digit after the decimal point and store it in the array + f = (f - (long)f) * 10; + frac_str[len] = '0' + (long)f; + len++; + // Round up if necessary + if (fabs(f - (long)f) >= 0.5f) + { + frac_str[len - 1]++; + } + } + + // Print the string of digits + for (int j = 0; j < len; j++) + { + putchar(frac_str[j]); + } +} + +void __attribute__ ((noinline)) printMatrix(float * C, int N, int M) +{ + for(int i = 0; i < N; i++) { + for(int j = 0; j < M; j++) { + putfloat(C[i*N+j], 2); + if( j != M -1) + printf(", "); + } + printf("\n"); + } +} + int main() { int N = WIDTH; @@ -52,6 +137,12 @@ int main() errors = check_results(m_c, N, M); PRINTF("program finished with %d errors and %d cycles\n\r", errors, cycles); + +#ifdef ENABLE_PRINTF + printMatrix(m_c,N,M); +#endif + + return errors; } diff --git a/sw/applications/example_spi_flash/main.c b/sw/applications/example_spi_flash_write/main.c similarity index 96% rename from sw/applications/example_spi_flash/main.c rename to sw/applications/example_spi_flash_write/main.c index 17638e1c1..d08265cf2 100644 --- a/sw/applications/example_spi_flash/main.c +++ b/sw/applications/example_spi_flash_write/main.c @@ -51,12 +51,6 @@ #define COPY_DATA_PER_CYCLE COPY_DATA_UNITS #endif //TEST_CIRCULAR - -// Warning in case of targetting simulation -#ifdef TARGET_SIM - #pragma message("This app does not allow Flash write operations in simulation!") -#endif - #define REVERT_24b_ADDR(addr) ((((uint32_t)addr & 0xff0000) >> 16) | ((uint32_t)addr & 0xff00) | (((uint32_t)addr & 0xff) << 16)) #define FLASH_ADDR 0x00008500 // 256B data alignment @@ -278,6 +272,22 @@ static inline __attribute__((always_inline)) void spi_wait_4_resp() int main(int argc, char *argv[]) { +#ifdef TARGET_SIM + #pragma message("This app does not allow Flash write operations in simulation!") + PRINTF("Flash writes are not permitted during Simulation, only on FPGA\n"); + return EXIT_SUCCESS; +#endif + + soc_ctrl_t soc_ctrl; + soc_ctrl.base_addr = mmio_region_from_addr((uintptr_t)SOC_CTRL_START_ADDRESS); + +#ifdef USE_SPI_FLASH + if ( get_spi_flash_mode(&soc_ctrl) == SOC_CTRL_SPI_FLASH_MODE_SPIMEMIO ) + { + PRINTF("This application cannot work with the memory mapped SPI FLASH module - do not use the FLASH_EXEC linker script for this application\n"); + return EXIT_SUCCESS; + } +#endif spi_config(); dma_init(NULL); diff --git a/sw/applications/example_spi_host/main.c b/sw/applications/example_spi_host/main.c index 74eacad02..a089c80b7 100644 --- a/sw/applications/example_spi_host/main.c +++ b/sw/applications/example_spi_host/main.c @@ -65,6 +65,17 @@ void fic_irq_spi_flash(void) int main(int argc, char *argv[]) { + + soc_ctrl_t soc_ctrl; + soc_ctrl.base_addr = mmio_region_from_addr((uintptr_t)SOC_CTRL_START_ADDRESS); + +#ifdef USE_SPI_FLASH + if ( get_spi_flash_mode(&soc_ctrl) == SOC_CTRL_SPI_FLASH_MODE_SPIMEMIO ) + { + PRINTF("This application cannot work with the memory mapped SPI FLASH module - do not use the FLASH_EXEC linker script for this application\n"); + return EXIT_SUCCESS; + } +#endif // spi_host_t spi_host; #ifndef USE_SPI_FLASH spi_host.base_addr = mmio_region_from_addr((uintptr_t)SPI_HOST_START_ADDRESS); @@ -72,8 +83,6 @@ int main(int argc, char *argv[]) spi_host.base_addr = mmio_region_from_addr((uintptr_t)SPI_FLASH_START_ADDRESS); #endif - soc_ctrl_t soc_ctrl; - soc_ctrl.base_addr = mmio_region_from_addr((uintptr_t)SOC_CTRL_START_ADDRESS); uint32_t core_clk = soc_ctrl_get_frequency(&soc_ctrl); // Enable interrupt on processor side @@ -230,6 +239,9 @@ int main(int argc, char *argv[]) PRINTF("success!\n\r"); } else { PRINTF("failure, %d errors!\n\r", errors); + return EXIT_FAILURE; } + return EXIT_SUCCESS; + } diff --git a/sw/applications/example_spi_host_dma/main.c b/sw/applications/example_spi_host_dma/main.c index 011bdbdee..d2368f9cd 100644 --- a/sw/applications/example_spi_host_dma/main.c +++ b/sw/applications/example_spi_host_dma/main.c @@ -62,14 +62,25 @@ uint32_t copy_data[COPY_DATA_NUM] __attribute__ ((aligned (4))) = { 0 }; int main(int argc, char *argv[]) { + + soc_ctrl_t soc_ctrl; + soc_ctrl.base_addr = mmio_region_from_addr((uintptr_t)SOC_CTRL_START_ADDRESS); + +#ifdef USE_SPI_FLASH + if ( get_spi_flash_mode(&soc_ctrl) == SOC_CTRL_SPI_FLASH_MODE_SPIMEMIO ) + { + PRINTF("This application cannot work with the memory mapped SPI FLASH module - do not use the FLASH_EXEC linker script for this application\n"); + return EXIT_SUCCESS; + } +#endif + + #ifndef USE_SPI_FLASH spi_host.base_addr = mmio_region_from_addr((uintptr_t)SPI_HOST_START_ADDRESS); #else spi_host.base_addr = mmio_region_from_addr((uintptr_t)SPI_FLASH_START_ADDRESS); #endif - soc_ctrl_t soc_ctrl; - soc_ctrl.base_addr = mmio_region_from_addr((uintptr_t)SOC_CTRL_START_ADDRESS); uint32_t core_clk = soc_ctrl_get_frequency(&soc_ctrl); // Enable interrupt on processor side @@ -273,6 +284,7 @@ int main(int argc, char *argv[]) PRINTF("success! (bytes checked: %d)\n\r", count*sizeof(*copy_data)); } else { PRINTF("failure, %d errors! (Out of %d)\n\r", errors, count); + return EXIT_FAILURE; } return EXIT_SUCCESS; } diff --git a/sw/applications/example_spi_host_dma_power_gate/main.c b/sw/applications/example_spi_host_dma_power_gate/main.c index 53f1fc50e..b2c46b475 100644 --- a/sw/applications/example_spi_host_dma_power_gate/main.c +++ b/sw/applications/example_spi_host_dma_power_gate/main.c @@ -41,7 +41,7 @@ #define SPI_DATA_TYPE 0 // Number of elements to copy -#define COPY_DATA_NUM 256 +#define COPY_DATA_NUM 16 #define FLASH_CLK_MAX_HZ (133*1000*1000) // In Hz (133 MHz for the flash w25q128jvsim used in the EPFL Programmer) @@ -55,7 +55,7 @@ static power_manager_t power_manager; void dma_intr_handler_trans_done(void) { - PRINTF("This is a weak implementation of the DMA interrupt\n\r"); + PRINTF("Non-weak implementation of a DMA interrupt\n\r"); dma_intr_flag = 1; } @@ -73,13 +73,24 @@ void dma_intr_handler_trans_done(void) int main(int argc, char *argv[]) { + + soc_ctrl_t soc_ctrl; + soc_ctrl.base_addr = mmio_region_from_addr((uintptr_t)SOC_CTRL_START_ADDRESS); + +#ifdef USE_SPI_FLASH + if ( get_spi_flash_mode(&soc_ctrl) == SOC_CTRL_SPI_FLASH_MODE_SPIMEMIO ) + { + PRINTF("This application cannot work with the memory mapped SPI FLASH module - do not use the FLASH_EXEC linker script for this application\n"); + return EXIT_SUCCESS; + } +#endif + #ifndef USE_SPI_FLASH spi_host.base_addr = mmio_region_from_addr((uintptr_t)SPI_HOST_START_ADDRESS); #else spi_host.base_addr = mmio_region_from_addr((uintptr_t)SPI_FLASH_START_ADDRESS); #endif - // Setup power_manager mmio_region_t power_manager_reg = mmio_region_from_addr(POWER_MANAGER_START_ADDRESS); power_manager.base_addr = power_manager_reg; @@ -91,8 +102,6 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - soc_ctrl_t soc_ctrl; - soc_ctrl.base_addr = mmio_region_from_addr((uintptr_t)SOC_CTRL_START_ADDRESS); uint32_t core_clk = soc_ctrl_get_frequency(&soc_ctrl); // Enable interrupt on processor side @@ -314,6 +323,7 @@ int main(int argc, char *argv[]) PRINTF("success! (bytes checked: %d)\n\r", count*sizeof(*copy_data)); } else { PRINTF("failure, %d errors! (Out of %d)\n\r", errors, count); + return EXIT_FAILURE; } return EXIT_SUCCESS; } diff --git a/sw/device/lib/drivers/power_manager/data/power_manager.h.tpl b/sw/device/lib/drivers/power_manager/data/power_manager.h.tpl index dbfbd41fd..1fa20870a 100644 --- a/sw/device/lib/drivers/power_manager/data/power_manager.h.tpl +++ b/sw/device/lib/drivers/power_manager/data/power_manager.h.tpl @@ -107,14 +107,14 @@ typedef struct power_manager_ram_map_t { static power_manager_ram_map_t power_manager_ram_map[${ram_numbanks}] = { % for bank in range(ram_numbanks): - { - POWER_MANAGER_RAM_${bank}_CLK_GATE_REG_OFFSET, - POWER_MANAGER_POWER_GATE_RAM_BLOCK_${bank}_ACK_REG_OFFSET, - POWER_MANAGER_RAM_${bank}_SWITCH_REG_OFFSET, - POWER_MANAGER_RAM_${bank}_WAIT_ACK_SWITCH_ON_REG_OFFSET, - POWER_MANAGER_RAM_${bank}_ISO_REG_OFFSET, - POWER_MANAGER_RAM_${bank}_RETENTIVE_REG_OFFSET, - POWER_MANAGER_MONITOR_POWER_GATE_RAM_BLOCK_${bank}_REG_OFFSET + (power_manager_ram_map_t) { + .clk_gate = POWER_MANAGER_RAM_${bank}_CLK_GATE_REG_OFFSET, + .power_gate_ack = POWER_MANAGER_POWER_GATE_RAM_BLOCK_${bank}_ACK_REG_OFFSET, + .switch_off = POWER_MANAGER_RAM_${bank}_SWITCH_REG_OFFSET, + .wait_ack_switch = POWER_MANAGER_RAM_${bank}_WAIT_ACK_SWITCH_ON_REG_OFFSET, + .iso = POWER_MANAGER_RAM_${bank}_ISO_REG_OFFSET, + .retentive = POWER_MANAGER_RAM_${bank}_RETENTIVE_REG_OFFSET, + .monitor_power_gate = POWER_MANAGER_MONITOR_POWER_GATE_RAM_BLOCK_${bank}_REG_OFFSET }, % endfor }; @@ -131,14 +131,14 @@ typedef struct power_manager_external_map_t { static power_manager_external_map_t power_manager_external_map[${external_domains}] = { % for ext in range(external_domains): - { - POWER_MANAGER_POWER_GATE_EXTERNAL_${ext}_ACK_REG_OFFSET, - POWER_MANAGER_EXTERNAL_${ext}_RESET_REG_OFFSET, - POWER_MANAGER_EXTERNAL_${ext}_SWITCH_REG_OFFSET, - POWER_MANAGER_EXTERNAL_${ext}_WAIT_ACK_SWITCH_ON_REG_OFFSET, - POWER_MANAGER_EXTERNAL_${ext}_ISO_REG_OFFSET, - POWER_MANAGER_EXTERNAL_RAM_${ext}_RETENTIVE_REG_OFFSET, - POWER_MANAGER_MONITOR_POWER_GATE_EXTERNAL_${ext}_REG_OFFSET, + (power_manager_external_map_t) { + .power_gate_ack = POWER_MANAGER_POWER_GATE_EXTERNAL_${ext}_ACK_REG_OFFSET, + .reset = POWER_MANAGER_EXTERNAL_${ext}_RESET_REG_OFFSET, + .switch_off = POWER_MANAGER_EXTERNAL_${ext}_SWITCH_REG_OFFSET, + .wait_ack_switch = POWER_MANAGER_EXTERNAL_${ext}_WAIT_ACK_SWITCH_ON_REG_OFFSET, + .iso = POWER_MANAGER_EXTERNAL_${ext}_ISO_REG_OFFSET, + .retentive = POWER_MANAGER_EXTERNAL_RAM_${ext}_RETENTIVE_REG_OFFSET, + .monitor_power_gate = POWER_MANAGER_MONITOR_POWER_GATE_EXTERNAL_${ext}_REG_OFFSET, }, % endfor }; diff --git a/sw/device/lib/drivers/soc_ctrl/soc_ctrl.c b/sw/device/lib/drivers/soc_ctrl/soc_ctrl.c index 1591102c7..8fd7d5300 100644 --- a/sw/device/lib/drivers/soc_ctrl/soc_ctrl.c +++ b/sw/device/lib/drivers/soc_ctrl/soc_ctrl.c @@ -9,6 +9,7 @@ #include "mmio.h" +#include "soc_ctrl.h" #include "soc_ctrl_regs.h" // Generated. void soc_ctrl_set_valid(const soc_ctrl_t *soc_ctrl, uint8_t valid) { @@ -28,10 +29,15 @@ void soc_ctrl_set_frequency(const soc_ctrl_t *soc_ctrl, uint32_t frequency) { } void soc_ctrl_select_spi_memio(const soc_ctrl_t *soc_ctrl) { - mmio_region_write32(soc_ctrl->base_addr, (ptrdiff_t)(SOC_CTRL_USE_SPIMEMIO_REG_OFFSET), 0x1); + mmio_region_write32(soc_ctrl->base_addr, (ptrdiff_t)(SOC_CTRL_ENABLE_SPI_SEL_REG_OFFSET), 0x1); + mmio_region_write32(soc_ctrl->base_addr, (ptrdiff_t)(SOC_CTRL_USE_SPIMEMIO_REG_OFFSET), SOC_CTRL_SPI_FLASH_MODE_SPIMEMIO); } void soc_ctrl_select_spi_host(const soc_ctrl_t *soc_ctrl) { mmio_region_write32(soc_ctrl->base_addr, (ptrdiff_t)(SOC_CTRL_ENABLE_SPI_SEL_REG_OFFSET), 0x1); - mmio_region_write32(soc_ctrl->base_addr, (ptrdiff_t)(SOC_CTRL_USE_SPIMEMIO_REG_OFFSET), 0x0); + mmio_region_write32(soc_ctrl->base_addr, (ptrdiff_t)(SOC_CTRL_USE_SPIMEMIO_REG_OFFSET), SOC_CTRL_SPI_FLASH_MODE_SPIHOST); } + +uint32_t get_spi_flash_mode(const soc_ctrl_t *soc_ctrl) { + return mmio_region_read32(soc_ctrl->base_addr, (ptrdiff_t)(SOC_CTRL_USE_SPIMEMIO_REG_OFFSET)); +} \ No newline at end of file diff --git a/sw/device/lib/drivers/soc_ctrl/soc_ctrl.h b/sw/device/lib/drivers/soc_ctrl/soc_ctrl.h index a269d2403..9cfa45aff 100644 --- a/sw/device/lib/drivers/soc_ctrl/soc_ctrl.h +++ b/sw/device/lib/drivers/soc_ctrl/soc_ctrl.h @@ -14,6 +14,9 @@ extern "C" { #endif +#define SOC_CTRL_SPI_FLASH_MODE_SPIMEMIO 1 +#define SOC_CTRL_SPI_FLASH_MODE_SPIHOST 0 + /** * Initialization parameters for SOC CTRL. * @@ -56,6 +59,13 @@ void soc_ctrl_select_spi_memio(const soc_ctrl_t *soc_ctrl); */ void soc_ctrl_select_spi_host(const soc_ctrl_t *soc_ctrl); +/** + * Get the SPI mode selected + * @param soc_ctrl Pointer to soc_ctrl_t represting the target SOC CTRL. + */ + +uint32_t get_spi_flash_mode(const soc_ctrl_t *soc_ctrl); + #ifdef __cplusplus } #endif