| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| module ghazi_top ( |
| clk_i, |
| rst_lc_ni, |
| rst_ni, |
| ram_main_instr_req, |
| ram_main_instr_we, |
| ram_main_instr_addr, |
| ram_main_instr_wdata, |
| ram_main_instr_wmask, |
| ram_main_instr_rdata, |
| ram_main_instr_rvalid, |
| ram_main_instr_rerror, |
| ram_main_data_req, |
| ram_main_data_we, |
| ram_main_data_addr, |
| ram_main_data_wdata, |
| ram_main_data_wmask, |
| ram_main_data_rdata, |
| ram_main_data_rvalid, |
| ram_main_data_rerror, |
| jtag_tck_i, |
| jtag_tms_i, |
| jtag_trst_ni, |
| jtag_tdi_i, |
| jtag_tdo_o, |
| cio_gpio_gpio_p2d, |
| cio_gpio_gpio_d2p, |
| cio_gpio_gpio_en_d2p, |
| cio_uart_rx_p2d, |
| cio_uart_tx_d2p, |
| cio_uart_tx_en_d2p, |
| cio_spi_device_sck_p2d, |
| cio_spi_device_csb_p2d, |
| cio_spi_device_sdi_p2d, |
| cio_spi_device_sdo_d2p, |
| cio_spi_device_sdo_en_d2p, |
| ndmreset_req_o |
| ); |
| localparam integer brqrv_pkg_RegFileFF = 0; |
| parameter integer BuraqRegFile = brqrv_pkg_RegFileFF; |
| localparam integer brqrv_pkg_RV32MSingleCycle = 3; |
| parameter integer BuraqM = brqrv_pkg_RV32MSingleCycle; |
| parameter [0:0] BuraqPipeLine = 0; |
| input clk_i; |
| input rst_lc_ni; |
| input rst_ni; |
| output wire ram_main_instr_req; |
| output wire ram_main_instr_we; |
| output wire [13:0] ram_main_instr_addr; |
| output wire [31:0] ram_main_instr_wdata; |
| output wire [31:0] ram_main_instr_wmask; |
| input wire [31:0] ram_main_instr_rdata; |
| input wire ram_main_instr_rvalid; |
| input wire [1:0] ram_main_instr_rerror; |
| output wire ram_main_data_req; |
| output wire ram_main_data_we; |
| output wire [13:0] ram_main_data_addr; |
| output wire [31:0] ram_main_data_wdata; |
| output wire [31:0] ram_main_data_wmask; |
| input wire [31:0] ram_main_data_rdata; |
| input wire ram_main_data_rvalid; |
| input wire [1:0] ram_main_data_rerror; |
| input jtag_tck_i; |
| input jtag_tms_i; |
| input jtag_trst_ni; |
| input jtag_tdi_i; |
| output wire jtag_tdo_o; |
| input [31:0] cio_gpio_gpio_p2d; |
| output wire [31:0] cio_gpio_gpio_d2p; |
| output wire [31:0] cio_gpio_gpio_en_d2p; |
| input cio_uart_rx_p2d; |
| output wire cio_uart_tx_d2p; |
| output wire cio_uart_tx_en_d2p; |
| input cio_spi_device_sck_p2d; |
| input cio_spi_device_csb_p2d; |
| input cio_spi_device_sdi_p2d; |
| output wire cio_spi_device_sdo_d2p; |
| output wire cio_spi_device_sdo_en_d2p; |
| output wire ndmreset_req_o; |
| localparam [31:0] JTAG_IDCODE = {4'h0, 16'h4f54, 11'h426, 1'b1}; |
| localparam ArbiterImpl = "PPC"; |
| localparam [31:0] ADDR_SPACE_UART = 32'h40000000; |
| localparam [31:0] ADDR_SPACE_GPIO = 32'h40010000; |
| localparam [31:0] ADDR_SPACE_SRAMD = 32'h18000000; |
| localparam [31:0] ADDR_SPACE_SRAMI = 32'h00080000; |
| localparam [31:0] ADDR_SPACE_DEBUG_MEM = 32'h1a110000; |
| localparam [31:0] ADDR_SPACE_RV_PLIC = 32'h40090000; |
| localparam [31:0] ADDR_SPACE_SPI_DEVICE = 32'h40020000; |
| localparam [31:0] ADDR_SPACE_RV_TIMER = 32'h40080000; |
| localparam [31:0] ADDR_MASK_UART = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_GPIO = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SRAMD = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_SRAMI = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_DEBUG_MEM = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_PLIC = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SPI_DEVICE = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_TIMER = 32'h00000fff; |
| localparam [2:0] PutFullData = 3'h0; |
| localparam [2:0] PutPartialData = 3'h1; |
| localparam [2:0] Get = 3'h4; |
| localparam [2:0] AccessAck = 3'h0; |
| localparam [2:0] AccessAckData = 3'h1; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| function automatic [top_pkg_TL_SZW - 1:0] sv2v_cast_F00AF; |
| input reg [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_F00AF = inp; |
| endfunction |
| function automatic [top_pkg_TL_AIW - 1:0] sv2v_cast_F1F18; |
| input reg [top_pkg_TL_AIW - 1:0] inp; |
| sv2v_cast_F1F18 = inp; |
| endfunction |
| function automatic [top_pkg_TL_AW - 1:0] sv2v_cast_4CD75; |
| input reg [top_pkg_TL_AW - 1:0] inp; |
| sv2v_cast_4CD75 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DBW - 1:0] sv2v_cast_37199; |
| input reg [top_pkg_TL_DBW - 1:0] inp; |
| sv2v_cast_37199 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DW - 1:0] sv2v_cast_2497D; |
| input reg [top_pkg_TL_DW - 1:0] inp; |
| sv2v_cast_2497D = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] TL_H2D_DEFAULT = {1'sb0, 3'b000, 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_4CD75(1'sb0), sv2v_cast_37199(1'sb0), sv2v_cast_2497D(1'sb0), 16'b0000000000000000, 1'b1}; |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| function automatic [top_pkg_TL_DIW - 1:0] sv2v_cast_B5AB2; |
| input reg [top_pkg_TL_DIW - 1:0] inp; |
| sv2v_cast_B5AB2 = inp; |
| endfunction |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| function automatic [top_pkg_TL_DUW - 1:0] sv2v_cast_92577; |
| input reg [top_pkg_TL_DUW - 1:0] inp; |
| sv2v_cast_92577 = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] TL_D2H_DEFAULT = {1'sb0, sv2v_cast_3(3'b000), 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_B5AB2(1'sb0), sv2v_cast_2497D(1'sb0), sv2v_cast_92577(1'sb0), 1'sb0, 1'b1}; |
| wire [2:0] unused_spi_device; |
| wire core_sleep_o; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] main_tl_srami_req; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] main_tl_srami_rsp; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] main_tl_sramd_req; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] main_tl_sramd_rsp; |
| wire [40:0] intr_vector; |
| wire intr_rv_timer_timer_expired_0_0; |
| wire intr_uart_tx_watermark; |
| wire intr_uart_rx_watermark; |
| wire intr_uart_tx_empty; |
| wire intr_uart_rx_overflow; |
| wire intr_uart_rx_frame_err; |
| wire intr_uart_rx_break_err; |
| wire intr_uart_rx_timeout; |
| wire intr_uart_rx_parity_err; |
| wire [31:0] intr_gpio_gpio; |
| wire irq_plic; |
| wire msip; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] gpio_tl_req; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] gpio_tl_rsp; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] uart_tl_req; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] uart_tl_rsp; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] rv_plic_tl_req; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] rv_plic_tl_rsp; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] rv_timer_tl_req; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] rv_timer_tl_rsp; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] main_tl_corei_req; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] main_tl_corei_rsp; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] main_tl_cored_req; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] main_tl_cored_rsp; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] main_tl_dm_sba_req; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] main_tl_dm_sba_rsp; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] main_tl_debug_mem_req; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] main_tl_debug_mem_rsp; |
| wire debug_req; |
| localparam integer brqrv_pkg_RV32BNone = 0; |
| buraq_core_top #( |
| .PMPEnable(1), |
| .PMPGranularity(0), |
| .PMPNumRegions(16), |
| .MHPMCounterNum(10), |
| .MHPMCounterWidth(32), |
| .RV32E(0), |
| .RV32M(BuraqM), |
| .RV32B(brqrv_pkg_RV32BNone), |
| .RegFile(BuraqRegFile), |
| .BranchTargetALU(1), |
| .WritebackStage(1), |
| .ICache(0), |
| .ICacheECC(0), |
| .BranchPredictor(0), |
| .DbgTriggerEn(1), |
| .SecureBuraq(0), |
| .PipeLine(BuraqPipeLine) |
| ) u_rv_buraq_core( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .test_en_i(1'b0), |
| .hart_id_i(32'b00000000000000000000000000000000), |
| .boot_addr_i(32'h00080000), |
| .tl_i_o(main_tl_corei_req), |
| .tl_i_i(main_tl_corei_rsp), |
| .tl_d_o(main_tl_cored_req), |
| .tl_d_i(main_tl_cored_rsp), |
| .irq_software_i(msip), |
| .irq_timer_i(intr_rv_timer_timer_expired_0_0), |
| .irq_external_i(irq_plic), |
| .esc_tx_i(), |
| .esc_rx_o(), |
| .debug_req_i(debug_req), |
| .fetch_enable_i(1'b1), |
| .core_sleep_o(core_sleep_o) |
| ); |
| tlul_adapter_sram #( |
| .SramAw(14), |
| .SramDw(32), |
| .Outstanding(2) |
| ) imem( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(main_tl_srami_req), |
| .tl_o(main_tl_srami_rsp), |
| .req_o(ram_main_instr_req), |
| .gnt_i(1'b1), |
| .we_o(ram_main_instr_we), |
| .addr_o(ram_main_instr_addr), |
| .wdata_o(ram_main_instr_wdata), |
| .wmask_o(ram_main_instr_wmask), |
| .rdata_i(ram_main_instr_rdata), |
| .rvalid_i(ram_main_instr_rvalid), |
| .rerror_i(ram_main_instr_rerror) |
| ); |
| tlul_adapter_sram #( |
| .SramAw(14), |
| .SramDw(32), |
| .Outstanding(2) |
| ) lmem( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(main_tl_sramd_req), |
| .tl_o(main_tl_sramd_rsp), |
| .req_o(ram_main_data_req), |
| .gnt_i(1'b1), |
| .we_o(ram_main_data_we), |
| .addr_o(ram_main_data_addr), |
| .wdata_o(ram_main_data_wdata), |
| .wmask_o(ram_main_data_wmask), |
| .rdata_i(ram_main_data_rdata), |
| .rvalid_i(ram_main_data_rvalid), |
| .rerror_i(ram_main_data_rerror) |
| ); |
| rv_dm #( |
| .NrHarts(1), |
| .IdcodeValue(JTAG_IDCODE) |
| ) u_dm_top( |
| .clk_i(clk_i), |
| .rst_ni(rst_lc_ni), |
| .testmode_i(1'b0), |
| .ndmreset_o(ndmreset_req_o), |
| .dmactive_o(), |
| .debug_req_o(debug_req), |
| .unavailable_i(1'b0), |
| .tl_d_i(main_tl_debug_mem_req), |
| .tl_d_o(main_tl_debug_mem_rsp), |
| .tl_h_o(main_tl_dm_sba_req), |
| .tl_h_i(main_tl_dm_sba_rsp), |
| .tck_i(jtag_tck_i), |
| .tms_i(jtag_tms_i), |
| .trst_ni(jtag_trst_ni), |
| .td_i(jtag_tdi_i), |
| .td_o(jtag_tdo_o), |
| .tdo_oe_o() |
| ); |
| tlul_gpio u_gpio( |
| .cio_gpio_i(cio_gpio_gpio_p2d), |
| .cio_gpio_o(cio_gpio_gpio_d2p), |
| .cio_gpio_en_o(cio_gpio_gpio_en_d2p), |
| .intr_gpio_o(intr_gpio_gpio), |
| .tl_i(gpio_tl_req), |
| .tl_o(gpio_tl_rsp), |
| .clk_i(clk_i), |
| .rst_ni(rst_ni) |
| ); |
| uart u_uart( |
| .cio_rx_i(cio_uart_rx_p2d), |
| .cio_tx_o(cio_uart_tx_d2p), |
| .cio_tx_en_o(cio_uart_tx_en_d2p), |
| .intr_tx_watermark_o(intr_uart_tx_watermark), |
| .intr_rx_watermark_o(intr_uart_rx_watermark), |
| .intr_tx_empty_o(intr_uart_tx_empty), |
| .intr_rx_overflow_o(intr_uart_rx_overflow), |
| .intr_rx_frame_err_o(intr_uart_rx_frame_err), |
| .intr_rx_break_err_o(intr_uart_rx_break_err), |
| .intr_rx_timeout_o(intr_uart_rx_timeout), |
| .intr_rx_parity_err_o(intr_uart_rx_parity_err), |
| .tl_i(uart_tl_req), |
| .tl_o(uart_tl_rsp), |
| .clk_i(clk_i), |
| .rst_ni(rst_ni) |
| ); |
| rv_plic u_rv_plic( |
| .tl_i(rv_plic_tl_req), |
| .tl_o(rv_plic_tl_rsp), |
| .intr_src_i(intr_vector), |
| .irq_o(irq_plic), |
| .irq_id_o(), |
| .msip_o(msip), |
| .clk_i(clk_i), |
| .rst_ni(rst_ni) |
| ); |
| rv_timer u_rv_timer( |
| .intr_timer_expired_0_0_o(intr_rv_timer_timer_expired_0_0), |
| .tl_i(rv_timer_tl_req), |
| .tl_o(rv_timer_tl_rsp), |
| .clk_i(clk_i), |
| .rst_ni(rst_ni) |
| ); |
| xbar ghazi_xbar( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_corei_i(main_tl_corei_req), |
| .tl_corei_o(main_tl_corei_rsp), |
| .tl_cored_i(main_tl_cored_req), |
| .tl_cored_o(main_tl_cored_rsp), |
| .tl_dm_sba_i(main_tl_dm_sba_req), |
| .tl_dm_sba_o(main_tl_dm_sba_rsp), |
| .tl_srami_o(main_tl_srami_req), |
| .tl_srami_i(main_tl_srami_rsp), |
| .tl_sramd_o(main_tl_sramd_req), |
| .tl_sramd_i(main_tl_sramd_rsp), |
| .tl_gpio_o(gpio_tl_req), |
| .tl_gpio_i(gpio_tl_rsp), |
| .tl_uart_o(uart_tl_req), |
| .tl_uart_i(uart_tl_rsp), |
| .tl_debug_mem_o(main_tl_debug_mem_req), |
| .tl_debug_mem_i(main_tl_debug_mem_rsp), |
| .tl_rv_plic_o(rv_plic_tl_req), |
| .tl_rv_plic_i(rv_plic_tl_rsp), |
| .tl_spi_device_o(), |
| .tl_spi_device_i(), |
| .tl_rv_timer_o(rv_timer_tl_req), |
| .tl_rv_timer_i(rv_timer_tl_rsp) |
| ); |
| assign unused_spi_device = {cio_spi_device_sck_p2d, cio_spi_device_csb_p2d, cio_spi_device_sdi_p2d}; |
| assign cio_spi_device_sdo_d2p = 1'b0; |
| assign cio_spi_device_sdo_en_d2p = 1'b0; |
| assign intr_vector = {intr_uart_rx_parity_err, intr_uart_rx_timeout, intr_uart_rx_break_err, intr_uart_rx_frame_err, intr_uart_rx_overflow, intr_uart_tx_empty, intr_uart_rx_watermark, intr_uart_tx_watermark, intr_gpio_gpio, 1'b0}; |
| endmodule // ghazi_top |
| module xbar ( |
| clk_i, |
| rst_ni, |
| tl_corei_i, |
| tl_corei_o, |
| tl_cored_i, |
| tl_cored_o, |
| tl_dm_sba_i, |
| tl_dm_sba_o, |
| tl_srami_o, |
| tl_srami_i, |
| tl_sramd_o, |
| tl_sramd_i, |
| tl_gpio_o, |
| tl_gpio_i, |
| tl_uart_o, |
| tl_uart_i, |
| tl_debug_mem_o, |
| tl_debug_mem_i, |
| tl_rv_plic_o, |
| tl_rv_plic_i, |
| tl_spi_device_o, |
| tl_spi_device_i, |
| tl_rv_timer_o, |
| tl_rv_timer_i |
| ); |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_corei_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_corei_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_cored_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_cored_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_dm_sba_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_dm_sba_o; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_srami_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_srami_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_sramd_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_sramd_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_gpio_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_gpio_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_uart_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_uart_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_debug_mem_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_debug_mem_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_rv_plic_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_rv_plic_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_spi_device_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_spi_device_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_rv_timer_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_rv_timer_i; |
| localparam ArbiterImpl = "PPC"; |
| localparam [31:0] ADDR_SPACE_UART = 32'h40000000; |
| localparam [31:0] ADDR_SPACE_GPIO = 32'h40010000; |
| localparam [31:0] ADDR_SPACE_SRAMD = 32'h18000000; |
| localparam [31:0] ADDR_SPACE_SRAMI = 32'h00080000; |
| localparam [31:0] ADDR_SPACE_DEBUG_MEM = 32'h1a110000; |
| localparam [31:0] ADDR_SPACE_RV_PLIC = 32'h40090000; |
| localparam [31:0] ADDR_SPACE_SPI_DEVICE = 32'h40020000; |
| localparam [31:0] ADDR_SPACE_RV_TIMER = 32'h40080000; |
| localparam [31:0] ADDR_MASK_UART = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_GPIO = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SRAMD = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_SRAMI = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_DEBUG_MEM = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_PLIC = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SPI_DEVICE = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_TIMER = 32'h00000fff; |
| localparam [2:0] PutFullData = 3'h0; |
| localparam [2:0] PutPartialData = 3'h1; |
| localparam [2:0] Get = 3'h4; |
| localparam [2:0] AccessAck = 3'h0; |
| localparam [2:0] AccessAckData = 3'h1; |
| function automatic [top_pkg_TL_SZW - 1:0] sv2v_cast_F00AF; |
| input reg [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_F00AF = inp; |
| endfunction |
| function automatic [top_pkg_TL_AIW - 1:0] sv2v_cast_F1F18; |
| input reg [top_pkg_TL_AIW - 1:0] inp; |
| sv2v_cast_F1F18 = inp; |
| endfunction |
| function automatic [top_pkg_TL_AW - 1:0] sv2v_cast_4CD75; |
| input reg [top_pkg_TL_AW - 1:0] inp; |
| sv2v_cast_4CD75 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DBW - 1:0] sv2v_cast_37199; |
| input reg [top_pkg_TL_DBW - 1:0] inp; |
| sv2v_cast_37199 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DW - 1:0] sv2v_cast_2497D; |
| input reg [top_pkg_TL_DW - 1:0] inp; |
| sv2v_cast_2497D = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] TL_H2D_DEFAULT = {1'sb0, 3'b000, 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_4CD75(1'sb0), sv2v_cast_37199(1'sb0), sv2v_cast_2497D(1'sb0), 16'b0000000000000000, 1'b1}; |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DIW - 1:0] sv2v_cast_B5AB2; |
| input reg [top_pkg_TL_DIW - 1:0] inp; |
| sv2v_cast_B5AB2 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DUW - 1:0] sv2v_cast_92577; |
| input reg [top_pkg_TL_DUW - 1:0] inp; |
| sv2v_cast_92577 = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] TL_D2H_DEFAULT = {1'sb0, sv2v_cast_3(3'b000), 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_B5AB2(1'sb0), sv2v_cast_2497D(1'sb0), sv2v_cast_92577(1'sb0), 1'sb0, 1'b1}; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_s1n_12_us_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_s1n_12_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (7 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (7 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_s1n_12_ds_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (7 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (7 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_s1n_12_ds_d2h; |
| reg [2:0] dev_sel_s1n_12; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_s1n_18_us_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_s1n_18_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_s1n_18_ds_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_s1n_18_ds_d2h; |
| reg [1:0] dev_sel_s1n_18; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_sm1_19_us_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_sm1_19_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_sm1_19_ds_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_sm1_19_ds_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_sm1_20_us_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_sm1_20_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_sm1_20_ds_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_sm1_20_ds_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_sm1_21_us_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_sm1_21_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_sm1_21_ds_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_sm1_21_ds_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_sm1_25_us_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_sm1_25_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_sm1_25_ds_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_sm1_25_ds_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_sm1_26_us_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_sm1_26_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_sm1_26_ds_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_sm1_26_ds_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_sm1_29_us_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_sm1_29_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_sm1_29_ds_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_sm1_29_ds_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_sm1_30_us_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_sm1_30_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_sm1_30_ds_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_sm1_30_ds_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_sm1_31_us_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (2 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (2 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_sm1_31_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_sm1_31_ds_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_sm1_31_ds_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_s1n_35_us_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_s1n_35_us_d2h; |
| wire [(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (7 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (7 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15)):(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] tl_s1n_35_ds_h2d; |
| wire [(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (7 * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (7 * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW)):(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)] tl_s1n_35_ds_d2h; |
| reg [2:0] dev_sel_s1n_35; |
| wire [31:0] addr_test; |
| assign addr_test = tl_s1n_12_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)]; |
| assign tl_sm1_21_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_12_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (6 * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_12_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (6 * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_21_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_25_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_12_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (5 * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_12_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (5 * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_25_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_26_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_12_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (4 * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_12_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (4 * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_26_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_20_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_12_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (3 * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_12_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (3 * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_20_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_29_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_12_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (2 * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_12_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (2 * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_29_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_30_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_12_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_12_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_30_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_31_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_12_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_12_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_31_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_19_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_18_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_18_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_19_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_20_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_18_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_18_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_20_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_19_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_35_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (6 * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_35_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (6 * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_19_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_21_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_35_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (5 * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_35_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (5 * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_21_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_25_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_35_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (4 * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_35_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (4 * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_25_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_26_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_35_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (3 * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_35_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (3 * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_26_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_29_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_35_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (2 * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_35_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (2 * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_29_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_30_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_35_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_35_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_30_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_sm1_31_us_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] = tl_s1n_35_ds_h2d[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]; |
| assign tl_s1n_35_ds_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] = tl_sm1_31_us_d2h[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]; |
| assign tl_s1n_12_us_h2d = tl_cored_i; |
| assign tl_cored_o = tl_s1n_12_us_d2h; |
| assign tl_s1n_18_us_h2d = tl_corei_i; |
| assign tl_corei_o = tl_s1n_18_us_d2h; |
| assign tl_srami_o = tl_sm1_19_ds_h2d; |
| assign tl_sm1_19_ds_d2h = tl_srami_i; |
| assign tl_sramd_o = tl_sm1_21_ds_h2d; |
| assign tl_sm1_21_ds_d2h = tl_sramd_i; |
| assign tl_gpio_o = tl_sm1_25_ds_h2d; |
| assign tl_sm1_25_ds_d2h = tl_gpio_i; |
| assign tl_uart_o = tl_sm1_26_ds_h2d; |
| assign tl_sm1_26_ds_d2h = tl_uart_i; |
| assign tl_rv_plic_o = tl_sm1_29_ds_h2d; |
| assign tl_sm1_29_ds_d2h = tl_rv_plic_i; |
| assign tl_debug_mem_o = tl_sm1_20_ds_h2d; |
| assign tl_sm1_20_ds_d2h = tl_debug_mem_i; |
| assign tl_spi_device_o = tl_sm1_30_ds_h2d; |
| assign tl_sm1_30_ds_d2h = tl_spi_device_i; |
| assign tl_rv_timer_o = tl_sm1_31_ds_h2d; |
| assign tl_sm1_31_ds_d2h = tl_rv_timer_i; |
| assign tl_s1n_35_us_h2d = tl_dm_sba_i; |
| assign tl_dm_sba_o = tl_s1n_35_us_d2h; |
| always @(*) |
| if ((tl_s1n_12_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_SRAMD) == ADDR_SPACE_SRAMD) |
| dev_sel_s1n_12 = 3'b000; |
| else if ((tl_s1n_12_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_GPIO) == ADDR_SPACE_GPIO) |
| dev_sel_s1n_12 = 3'b001; |
| else if ((tl_s1n_12_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_UART) == ADDR_SPACE_UART) |
| dev_sel_s1n_12 = 3'b010; |
| else if ((tl_s1n_12_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_DEBUG_MEM) == ADDR_SPACE_DEBUG_MEM) |
| dev_sel_s1n_12 = 3'b011; |
| else if ((tl_s1n_12_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_RV_PLIC) == ADDR_SPACE_RV_PLIC) |
| dev_sel_s1n_12 = 3'b100; |
| else if ((tl_s1n_12_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_SPI_DEVICE) == ADDR_SPACE_SPI_DEVICE) |
| dev_sel_s1n_12 = 3'b101; |
| else if ((tl_s1n_12_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_RV_TIMER) == ADDR_SPACE_RV_TIMER) |
| dev_sel_s1n_12 = 3'b110; |
| else |
| dev_sel_s1n_12 = 3'b111; |
| always @(*) |
| if ((tl_s1n_18_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_SRAMI) == ADDR_SPACE_SRAMI) |
| dev_sel_s1n_18 = 2'b00; |
| else if ((tl_s1n_18_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_DEBUG_MEM) == ADDR_SPACE_DEBUG_MEM) |
| dev_sel_s1n_18 = 2'b01; |
| else |
| dev_sel_s1n_18 = 2'b10; |
| always @(*) |
| if ((tl_s1n_35_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_SRAMI) == ADDR_SPACE_SRAMI) |
| dev_sel_s1n_35 = 3'b000; |
| else if ((tl_s1n_35_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_SRAMD) == ADDR_SPACE_SRAMD) |
| dev_sel_s1n_35 = 3'b001; |
| else if ((tl_s1n_35_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_GPIO) == ADDR_SPACE_GPIO) |
| dev_sel_s1n_35 = 3'b010; |
| else if ((tl_s1n_35_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_UART) == ADDR_SPACE_UART) |
| dev_sel_s1n_35 = 3'b011; |
| else if ((tl_s1n_35_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_RV_PLIC) == ADDR_SPACE_RV_PLIC) |
| dev_sel_s1n_35 = 3'b100; |
| else if ((tl_s1n_35_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_SPI_DEVICE) == ADDR_SPACE_SPI_DEVICE) |
| dev_sel_s1n_35 = 3'b101; |
| else if ((tl_s1n_35_us_h2d[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] & ~ADDR_MASK_RV_TIMER) == ADDR_SPACE_RV_TIMER) |
| dev_sel_s1n_35 = 3'b110; |
| else |
| dev_sel_s1n_35 = 3'b111; |
| tlul_socket_1n #( |
| .HReqDepth(4'h0), |
| .HRspDepth(4'h0), |
| .DReqDepth(16'h0000), |
| .DRspDepth(16'h0000), |
| .N(7) |
| ) u_s1n_12( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_s1n_12_us_h2d), |
| .tl_h_o(tl_s1n_12_us_d2h), |
| .tl_d_o(tl_s1n_12_ds_h2d), |
| .tl_d_i(tl_s1n_12_ds_d2h), |
| .dev_select_i(dev_sel_s1n_12) |
| ); |
| tlul_socket_1n #( |
| .HReqDepth(4'h0), |
| .HRspDepth(4'h0), |
| .DReqDepth(8'h00), |
| .DRspDepth(8'h00), |
| .N(2) |
| ) u_s1n_18( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_s1n_18_us_h2d), |
| .tl_h_o(tl_s1n_18_us_d2h), |
| .tl_d_o(tl_s1n_18_ds_h2d), |
| .tl_d_i(tl_s1n_18_ds_d2h), |
| .dev_select_i(dev_sel_s1n_18) |
| ); |
| tlul_socket_m1 #( |
| .HReqDepth(12'h000), |
| .HRspDepth(12'h000), |
| .DReqDepth(4'h0), |
| .DRspDepth(4'h0), |
| .M(2) |
| ) u_sm1_19( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_sm1_19_us_h2d), |
| .tl_h_o(tl_sm1_19_us_d2h), |
| .tl_d_o(tl_sm1_19_ds_h2d), |
| .tl_d_i(tl_sm1_19_ds_d2h) |
| ); |
| tlul_socket_m1 #( |
| .HReqDepth(8'h00), |
| .HRspDepth(8'h00), |
| .DReqPass(1'b0), |
| .DRspPass(1'b0), |
| .M(2) |
| ) u_sm1_20( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_sm1_20_us_h2d), |
| .tl_h_o(tl_sm1_20_us_d2h), |
| .tl_d_o(tl_sm1_20_ds_h2d), |
| .tl_d_i(tl_sm1_20_ds_d2h) |
| ); |
| tlul_socket_m1 #( |
| .HReqDepth(12'h000), |
| .HRspDepth(12'h000), |
| .DReqDepth(4'h0), |
| .DRspDepth(4'h0), |
| .M(2) |
| ) u_sm1_21( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_sm1_21_us_h2d), |
| .tl_h_o(tl_sm1_21_us_d2h), |
| .tl_d_o(tl_sm1_21_ds_h2d), |
| .tl_d_i(tl_sm1_21_ds_d2h) |
| ); |
| tlul_socket_m1 #( |
| .HReqDepth(8'h00), |
| .HRspDepth(8'h00), |
| .DReqDepth(4'h0), |
| .DRspDepth(4'h0), |
| .M(2) |
| ) u_sm1_25( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_sm1_25_us_h2d), |
| .tl_h_o(tl_sm1_25_us_d2h), |
| .tl_d_o(tl_sm1_25_ds_h2d), |
| .tl_d_i(tl_sm1_25_ds_d2h) |
| ); |
| tlul_socket_m1 #( |
| .HReqDepth(8'h00), |
| .HRspDepth(8'h00), |
| .DReqDepth(4'h0), |
| .DRspDepth(4'h0), |
| .M(2) |
| ) u_sm1_26( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_sm1_26_us_h2d), |
| .tl_h_o(tl_sm1_26_us_d2h), |
| .tl_d_o(tl_sm1_26_ds_h2d), |
| .tl_d_i(tl_sm1_26_ds_d2h) |
| ); |
| tlul_socket_m1 #( |
| .HReqDepth(8'h00), |
| .HRspDepth(8'h00), |
| .DReqPass(1'b0), |
| .DRspPass(1'b0), |
| .M(2) |
| ) u_sm1_29( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_sm1_29_us_h2d), |
| .tl_h_o(tl_sm1_29_us_d2h), |
| .tl_d_o(tl_sm1_29_ds_h2d), |
| .tl_d_i(tl_sm1_29_ds_d2h) |
| ); |
| tlul_socket_m1 #( |
| .HReqDepth(8'h00), |
| .HRspDepth(8'h00), |
| .DReqDepth(4'h0), |
| .DRspDepth(4'h0), |
| .M(2) |
| ) u_sm1_30( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_sm1_30_us_h2d), |
| .tl_h_o(tl_sm1_30_us_d2h), |
| .tl_d_o(tl_sm1_30_ds_h2d), |
| .tl_d_i(tl_sm1_30_ds_d2h) |
| ); |
| tlul_socket_m1 #( |
| .HReqDepth(8'h00), |
| .HRspDepth(8'h00), |
| .DReqDepth(4'h0), |
| .DRspDepth(4'h0), |
| .M(2) |
| ) u_sm1_31( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_sm1_31_us_h2d), |
| .tl_h_o(tl_sm1_31_us_d2h), |
| .tl_d_o(tl_sm1_31_ds_h2d), |
| .tl_d_i(tl_sm1_31_ds_d2h) |
| ); |
| tlul_socket_1n #( |
| .HReqDepth(4'h0), |
| .HRspDepth(4'h0), |
| .DReqDepth(16'h0000), |
| .DRspDepth(16'h0000), |
| .N(7) |
| ) u_s1n_35( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_s1n_35_us_h2d), |
| .tl_h_o(tl_s1n_35_us_d2h), |
| .tl_d_o(tl_s1n_35_ds_h2d), |
| .tl_d_i(tl_s1n_35_ds_d2h), |
| .dev_select_i(dev_sel_s1n_12) |
| ); |
| endmodule |
| module buraq_core_top ( |
| clk_i, |
| rst_ni, |
| test_en_i, |
| hart_id_i, |
| boot_addr_i, |
| tl_i_o, |
| tl_i_i, |
| tl_d_o, |
| tl_d_i, |
| irq_software_i, |
| irq_timer_i, |
| irq_external_i, |
| esc_tx_i, |
| esc_rx_o, |
| debug_req_i, |
| fetch_enable_i, |
| core_sleep_o |
| ); |
| parameter [0:0] PMPEnable = 1'b0; |
| parameter [31:0] PMPGranularity = 0; |
| parameter [31:0] PMPNumRegions = 4; |
| parameter [31:0] MHPMCounterNum = 10; |
| parameter [31:0] MHPMCounterWidth = 32; |
| parameter [0:0] RV32E = 0; |
| localparam integer brqrv_pkg_RV32MSingleCycle = 3; |
| parameter integer RV32M = brqrv_pkg_RV32MSingleCycle; |
| localparam integer brqrv_pkg_RV32BNone = 0; |
| parameter integer RV32B = brqrv_pkg_RV32BNone; |
| localparam integer brqrv_pkg_RegFileFF = 0; |
| parameter integer RegFile = brqrv_pkg_RegFileFF; |
| parameter [0:0] BranchTargetALU = 1'b1; |
| parameter [0:0] WritebackStage = 1'b1; |
| parameter [0:0] ICache = 1'b0; |
| parameter [0:0] ICacheECC = 1'b0; |
| parameter [0:0] BranchPredictor = 1'b0; |
| parameter [0:0] DbgTriggerEn = 1'b1; |
| parameter [0:0] SecureBuraq = 1'b0; |
| parameter [31:0] DmHaltAddr = 32'h1a110800; |
| parameter [31:0] DmExceptionAddr = 32'h1a110808; |
| parameter [0:0] PipeLine = 1'b0; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire test_en_i; |
| input wire [31:0] hart_id_i; |
| input wire [31:0] boot_addr_i; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i_o; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_i_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_d_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_d_i; |
| input wire irq_software_i; |
| input wire irq_timer_i; |
| input wire irq_external_i; |
| input wire [1:0] esc_tx_i; |
| output wire [1:0] esc_rx_o; |
| input wire debug_req_i; |
| input wire fetch_enable_i; |
| output wire core_sleep_o; |
| localparam signed [31:0] TL_AW = 32; |
| localparam signed [31:0] TL_DW = 32; |
| localparam signed [31:0] TL_AIW = 8; |
| localparam signed [31:0] TL_DIW = 1; |
| localparam signed [31:0] TL_DUW = 16; |
| localparam signed [31:0] TL_DBW = TL_DW >> 3; |
| localparam signed [31:0] TL_SZW = $clog2($clog2(TL_DBW) + 1); |
| localparam signed [31:0] FLASH_BANKS = 2; |
| localparam signed [31:0] FLASH_PAGES_PER_BANK = 256; |
| localparam signed [31:0] FLASH_WORDS_PER_PAGE = 128; |
| localparam signed [31:0] FLASH_INFO_TYPES = 2; |
| localparam signed [(FLASH_INFO_TYPES * 32) - 1:0] FLASH_INFO_PER_BANK = {32'sd4, 32'sd4}; |
| localparam signed [31:0] FLASH_DATA_WIDTH = 64; |
| localparam signed [31:0] FLASH_METADATA_WIDTH = 12; |
| localparam signed [31:0] NUM_AST_ALERTS = 7; |
| localparam signed [31:0] NUM_IO_RAILS = 2; |
| localparam signed [31:0] ENTROPY_STREAM = 4; |
| localparam signed [31:0] ADC_CHANNELS = 2; |
| localparam signed [31:0] ADC_DATAW = 10; |
| localparam ArbiterImpl = "PPC"; |
| localparam [31:0] ADDR_SPACE_UART = 32'h40000000; |
| localparam [31:0] ADDR_SPACE_GPIO = 32'h40010000; |
| localparam [31:0] ADDR_SPACE_SRAMD = 32'h18000000; |
| localparam [31:0] ADDR_SPACE_SRAMI = 32'h00080000; |
| localparam [31:0] ADDR_SPACE_DEBUG_MEM = 32'h1a110000; |
| localparam [31:0] ADDR_SPACE_RV_PLIC = 32'h40090000; |
| localparam [31:0] ADDR_SPACE_SPI_DEVICE = 32'h40020000; |
| localparam [31:0] ADDR_SPACE_RV_TIMER = 32'h40080000; |
| localparam [31:0] ADDR_MASK_UART = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_GPIO = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SRAMD = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_SRAMI = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_DEBUG_MEM = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_PLIC = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SPI_DEVICE = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_TIMER = 32'h00000fff; |
| localparam [2:0] PutFullData = 3'h0; |
| localparam [2:0] PutPartialData = 3'h1; |
| localparam [2:0] Get = 3'h4; |
| localparam [2:0] AccessAck = 3'h0; |
| localparam [2:0] AccessAckData = 3'h1; |
| function automatic [top_pkg_TL_SZW - 1:0] sv2v_cast_F00AF; |
| input reg [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_F00AF = inp; |
| endfunction |
| function automatic [top_pkg_TL_AIW - 1:0] sv2v_cast_F1F18; |
| input reg [top_pkg_TL_AIW - 1:0] inp; |
| sv2v_cast_F1F18 = inp; |
| endfunction |
| function automatic [top_pkg_TL_AW - 1:0] sv2v_cast_4CD75; |
| input reg [top_pkg_TL_AW - 1:0] inp; |
| sv2v_cast_4CD75 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DBW - 1:0] sv2v_cast_37199; |
| input reg [top_pkg_TL_DBW - 1:0] inp; |
| sv2v_cast_37199 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DW - 1:0] sv2v_cast_2497D; |
| input reg [top_pkg_TL_DW - 1:0] inp; |
| sv2v_cast_2497D = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] TL_H2D_DEFAULT = {1'sb0, 3'b000, 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_4CD75(1'sb0), sv2v_cast_37199(1'sb0), sv2v_cast_2497D(1'sb0), 16'b0000000000000000, 1'b1}; |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DIW - 1:0] sv2v_cast_B5AB2; |
| input reg [top_pkg_TL_DIW - 1:0] inp; |
| sv2v_cast_B5AB2 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DUW - 1:0] sv2v_cast_92577; |
| input reg [top_pkg_TL_DUW - 1:0] inp; |
| sv2v_cast_92577 = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] TL_D2H_DEFAULT = {1'sb0, sv2v_cast_3(3'b000), 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_B5AB2(1'sb0), sv2v_cast_2497D(1'sb0), sv2v_cast_92577(1'sb0), 1'sb0, 1'b1}; |
| localparam signed [31:0] FifoPass = (PipeLine ? 1'b0 : 1'b1); |
| localparam signed [31:0] FifoDepth = (PipeLine ? 4'h2 : 4'h0); |
| wire instr_req; |
| wire instr_gnt; |
| wire instr_rvalid; |
| wire [31:0] instr_addr; |
| wire [31:0] instr_rdata; |
| wire instr_err; |
| wire data_req; |
| wire data_gnt; |
| wire data_rvalid; |
| wire data_we; |
| wire [3:0] data_be; |
| wire [31:0] data_addr; |
| wire [31:0] data_wdata; |
| wire [31:0] data_rdata; |
| wire data_err; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i_brqrv2fifo; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_i_fifo2brqrv; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_d_brqrv2fifo; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_d_fifo2brqrv; |
| wire irq_nm; |
| prim_esc_receiver i_prim_esc_receiver( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .esc_en_o(irq_nm), |
| .esc_rx_o(esc_rx_o), |
| .esc_tx_i(esc_tx_i) |
| ); |
| wire alert_minor; |
| wire alert_major; |
| wire unused_alert_minor; |
| wire unused_alert_major; |
| assign unused_alert_minor = alert_minor; |
| assign unused_alert_major = alert_major; |
| brqrv_core #( |
| .PMPEnable(PMPEnable), |
| .PMPGranularity(PMPGranularity), |
| .PMPNumRegions(PMPNumRegions), |
| .MHPMCounterNum(MHPMCounterNum), |
| .MHPMCounterWidth(MHPMCounterWidth), |
| .RV32E(RV32E), |
| .RV32M(RV32M), |
| .RV32B(RV32B), |
| .RegFile(RegFile), |
| .BranchTargetALU(BranchTargetALU), |
| .WritebackStage(WritebackStage), |
| .ICache(ICache), |
| .ICacheECC(ICacheECC), |
| .BranchPredictor(BranchPredictor), |
| .DbgTriggerEn(DbgTriggerEn), |
| .SecureBuraq(SecureBuraq), |
| .DmHaltAddr(DmHaltAddr), |
| .DmExceptionAddr(DmExceptionAddr) |
| ) u_core( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .test_en_i(test_en_i), |
| .hart_id_i(hart_id_i), |
| .boot_addr_i(boot_addr_i), |
| .instr_req_o(instr_req), |
| .instr_gnt_i(instr_gnt), |
| .instr_rvalid_i(instr_rvalid), |
| .instr_addr_o(instr_addr), |
| .instr_rdata_i(instr_rdata), |
| .instr_err_i(instr_err), |
| .data_req_o(data_req), |
| .data_gnt_i(data_gnt), |
| .data_rvalid_i(data_rvalid), |
| .data_we_o(data_we), |
| .data_be_o(data_be), |
| .data_addr_o(data_addr), |
| .data_wdata_o(data_wdata), |
| .data_rdata_i(data_rdata), |
| .data_err_i(data_err), |
| .irq_software_i(irq_software_i), |
| .irq_timer_i(irq_timer_i), |
| .irq_external_i(irq_external_i), |
| .irq_fast_i({15 {1'sb0}}), |
| .irq_nm_i(irq_nm), |
| .debug_req_i(debug_req_i), |
| .fetch_enable_i(fetch_enable_i), |
| .alert_minor_o(alert_minor), |
| .alert_major_o(alert_major), |
| .core_sleep_o(core_sleep_o) |
| ); |
| tlul_adapter_host #(.MAX_REQS(2)) tl_adapter_host_i_brqrv( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .req_i(instr_req), |
| .gnt_o(instr_gnt), |
| .addr_i(instr_addr), |
| .we_i(1'b0), |
| .wdata_i(32'b00000000000000000000000000000000), |
| .be_i(4'hf), |
| .valid_o(instr_rvalid), |
| .rdata_o(instr_rdata), |
| .err_o(instr_err), |
| .tl_o(tl_i_brqrv2fifo), |
| .tl_i(tl_i_fifo2brqrv) |
| ); |
| tlul_fifo_sync #( |
| .ReqPass(FifoPass), |
| .RspPass(FifoPass), |
| .ReqDepth(FifoDepth), |
| .RspDepth(FifoDepth) |
| ) fifo_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_i_brqrv2fifo), |
| .tl_h_o(tl_i_fifo2brqrv), |
| .tl_d_o(tl_i_o), |
| .tl_d_i(tl_i_i), |
| .spare_req_i(1'b0), |
| .spare_req_o(), |
| .spare_rsp_i(1'b0), |
| .spare_rsp_o() |
| ); |
| tlul_adapter_host #(.MAX_REQS(2)) tl_adapter_host_d_brqrv( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .req_i(data_req), |
| .gnt_o(data_gnt), |
| .addr_i(data_addr), |
| .we_i(data_we), |
| .wdata_i(data_wdata), |
| .be_i(data_be), |
| .valid_o(data_rvalid), |
| .rdata_o(data_rdata), |
| .err_o(data_err), |
| .tl_o(tl_d_brqrv2fifo), |
| .tl_i(tl_d_fifo2brqrv) |
| ); |
| tlul_fifo_sync #( |
| .ReqPass(FifoPass), |
| .RspPass(FifoPass), |
| .ReqDepth(FifoDepth), |
| .RspDepth(FifoDepth) |
| ) fifo_d( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_d_brqrv2fifo), |
| .tl_h_o(tl_d_fifo2brqrv), |
| .tl_d_o(tl_d_o), |
| .tl_d_i(tl_d_i), |
| .spare_req_i(1'b0), |
| .spare_req_o(), |
| .spare_rsp_i(1'b0), |
| .spare_rsp_o() |
| ); |
| endmodule |
| module brqrv_core ( |
| clk_i, |
| rst_ni, |
| test_en_i, |
| hart_id_i, |
| boot_addr_i, |
| instr_req_o, |
| instr_gnt_i, |
| instr_rvalid_i, |
| instr_addr_o, |
| instr_rdata_i, |
| instr_err_i, |
| data_req_o, |
| data_gnt_i, |
| data_rvalid_i, |
| data_we_o, |
| data_be_o, |
| data_addr_o, |
| data_wdata_o, |
| data_rdata_i, |
| data_err_i, |
| irq_software_i, |
| irq_timer_i, |
| irq_external_i, |
| irq_fast_i, |
| irq_nm_i, |
| debug_req_i, |
| fetch_enable_i, |
| alert_minor_o, |
| alert_major_o, |
| core_sleep_o |
| ); |
| parameter [0:0] PMPEnable = 1'b0; |
| parameter [31:0] PMPGranularity = 0; |
| parameter [31:0] PMPNumRegions = 4; |
| parameter [31:0] MHPMCounterNum = 0; |
| parameter [31:0] MHPMCounterWidth = 40; |
| parameter [0:0] RV32E = 1'b0; |
| localparam integer brqrv_pkg_RV32MFast = 2; |
| parameter integer RV32M = brqrv_pkg_RV32MFast; |
| localparam integer brqrv_pkg_RV32BNone = 0; |
| parameter integer RV32B = brqrv_pkg_RV32BNone; |
| localparam integer brqrv_pkg_RegFileFF = 0; |
| parameter integer RegFile = brqrv_pkg_RegFileFF; |
| parameter [0:0] BranchTargetALU = 1'b0; |
| parameter [0:0] WritebackStage = 1'b0; |
| parameter [0:0] ICache = 1'b0; |
| parameter [0:0] ICacheECC = 1'b0; |
| parameter [0:0] BranchPredictor = 1'b0; |
| parameter [0:0] DbgTriggerEn = 1'b0; |
| parameter [0:0] SecureBuraq = 1'b0; |
| parameter [31:0] DmHaltAddr = 32'h1a110800; |
| parameter [31:0] DmExceptionAddr = 32'h1a110808; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire test_en_i; |
| input wire [31:0] hart_id_i; |
| input wire [31:0] boot_addr_i; |
| output wire instr_req_o; |
| input wire instr_gnt_i; |
| input wire instr_rvalid_i; |
| output wire [31:0] instr_addr_o; |
| input wire [31:0] instr_rdata_i; |
| input wire instr_err_i; |
| output wire data_req_o; |
| input wire data_gnt_i; |
| input wire data_rvalid_i; |
| output wire data_we_o; |
| output wire [3:0] data_be_o; |
| output wire [31:0] data_addr_o; |
| output wire [31:0] data_wdata_o; |
| input wire [31:0] data_rdata_i; |
| input wire data_err_i; |
| input wire irq_software_i; |
| input wire irq_timer_i; |
| input wire irq_external_i; |
| input wire [14:0] irq_fast_i; |
| input wire irq_nm_i; |
| input wire debug_req_i; |
| input wire fetch_enable_i; |
| output wire alert_minor_o; |
| output wire alert_major_o; |
| output wire core_sleep_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| localparam [31:0] PMP_NUM_CHAN = 2; |
| localparam [0:0] DataIndTiming = SecureBuraq; |
| localparam [0:0] DummyInstructions = SecureBuraq; |
| localparam [0:0] SpecBranch = PMPEnable & (PMPNumRegions == 16); |
| localparam [0:0] RegFileECC = SecureBuraq; |
| localparam [31:0] RegFileDataWidth = (RegFileECC ? 39 : 32); |
| wire dummy_instr_id; |
| wire instr_valid_id; |
| wire instr_new_id; |
| wire [31:0] instr_rdata_id; |
| wire [31:0] instr_rdata_alu_id; |
| wire [15:0] instr_rdata_c_id; |
| wire instr_is_compressed_id; |
| wire instr_bp_taken_id; |
| wire instr_fetch_err; |
| wire instr_fetch_err_plus2; |
| wire illegal_c_insn_id; |
| wire [31:0] pc_if; |
| wire [31:0] pc_id; |
| wire [31:0] pc_wb; |
| wire [67:0] imd_val_d_ex; |
| wire [67:0] imd_val_q_ex; |
| wire [1:0] imd_val_we_ex; |
| wire data_ind_timing; |
| wire dummy_instr_en; |
| wire [2:0] dummy_instr_mask; |
| wire dummy_instr_seed_en; |
| wire [31:0] dummy_instr_seed; |
| wire icache_enable; |
| wire icache_inval; |
| wire pc_mismatch_alert; |
| wire instr_first_cycle_id; |
| wire instr_valid_clear; |
| wire pc_set; |
| wire pc_set_spec; |
| wire nt_branch_mispredict; |
| wire [2:0] pc_mux_id; |
| wire [1:0] exc_pc_mux_id; |
| wire [5:0] exc_cause; |
| wire lsu_load_err; |
| wire lsu_store_err; |
| wire lsu_addr_incr_req; |
| wire [31:0] lsu_addr_last; |
| wire [31:0] branch_target_ex; |
| wire branch_decision; |
| wire ctrl_busy; |
| wire if_busy; |
| wire lsu_busy; |
| wire core_busy_d; |
| reg core_busy_q; |
| wire [4:0] rf_raddr_a; |
| wire [31:0] rf_rdata_a; |
| wire [4:0] rf_raddr_b; |
| wire [31:0] rf_rdata_b; |
| wire rf_ren_a; |
| wire rf_ren_b; |
| wire [4:0] rf_waddr_wb; |
| wire [31:0] rf_wdata_wb; |
| wire [31:0] rf_wdata_fwd_wb; |
| wire [31:0] rf_wdata_lsu; |
| wire rf_we_wb; |
| wire rf_we_lsu; |
| wire [4:0] rf_waddr_id; |
| wire [31:0] rf_wdata_id; |
| wire rf_we_id; |
| wire rf_rd_a_wb_match; |
| wire rf_rd_b_wb_match; |
| wire [5:0] alu_operator_ex; |
| wire [31:0] alu_operand_a_ex; |
| wire [31:0] alu_operand_b_ex; |
| wire [31:0] bt_a_operand; |
| wire [31:0] bt_b_operand; |
| wire [31:0] alu_adder_result_ex; |
| wire [31:0] result_ex; |
| wire mult_en_ex; |
| wire div_en_ex; |
| wire mult_sel_ex; |
| wire div_sel_ex; |
| wire [1:0] multdiv_operator_ex; |
| wire [1:0] multdiv_signed_mode_ex; |
| wire [31:0] multdiv_operand_a_ex; |
| wire [31:0] multdiv_operand_b_ex; |
| wire multdiv_ready_id; |
| wire csr_access; |
| wire [1:0] csr_op; |
| wire csr_op_en; |
| wire [11:0] csr_addr; |
| wire [31:0] csr_rdata; |
| wire [31:0] csr_wdata; |
| wire illegal_csr_insn_id; |
| wire lsu_we; |
| wire [1:0] lsu_type; |
| wire lsu_sign_ext; |
| wire lsu_req; |
| wire [31:0] lsu_wdata; |
| wire lsu_req_done; |
| wire id_in_ready; |
| wire ex_valid; |
| wire lsu_resp_valid; |
| wire instr_req_int; |
| wire en_wb; |
| wire [1:0] instr_type_wb; |
| wire ready_wb; |
| wire rf_write_wb; |
| wire outstanding_load_wb; |
| wire outstanding_store_wb; |
| wire irq_pending; |
| wire nmi_mode; |
| wire [17:0] irqs; |
| wire csr_mstatus_mie; |
| wire [31:0] csr_mepc; |
| wire [31:0] csr_depc; |
| wire [(0 >= (PMPNumRegions - 1) ? ((2 - PMPNumRegions) * 34) + (((PMPNumRegions - 1) * 34) - 1) : (PMPNumRegions * 34) - 1):(0 >= (PMPNumRegions - 1) ? (PMPNumRegions - 1) * 34 : 0)] csr_pmp_addr; |
| wire [(0 >= (PMPNumRegions - 1) ? ((2 - PMPNumRegions) * 6) + (((PMPNumRegions - 1) * 6) - 1) : (PMPNumRegions * 6) - 1):(0 >= (PMPNumRegions - 1) ? (PMPNumRegions - 1) * 6 : 0)] csr_pmp_cfg; |
| wire [PMP_NUM_CHAN - 1:0] pmp_req_err; |
| wire instr_req_out; |
| wire data_req_out; |
| wire csr_save_if; |
| wire csr_save_id; |
| wire csr_save_wb; |
| wire csr_restore_mret_id; |
| wire csr_restore_dret_id; |
| wire csr_save_cause; |
| wire csr_mtvec_init; |
| wire [31:0] csr_mtvec; |
| wire [31:0] csr_mtval; |
| wire csr_mstatus_tw; |
| wire [1:0] priv_mode_id; |
| wire [1:0] priv_mode_if; |
| wire [1:0] priv_mode_lsu; |
| wire debug_mode; |
| wire [2:0] debug_cause; |
| wire debug_csr_save; |
| wire debug_single_step; |
| wire debug_ebreakm; |
| wire debug_ebreaku; |
| wire trigger_match; |
| wire instr_id_done; |
| wire instr_id_done_compressed; |
| wire instr_done_wb; |
| wire perf_iside_wait; |
| wire perf_dside_wait; |
| wire perf_mul_wait; |
| wire perf_div_wait; |
| wire perf_jump; |
| wire perf_branch; |
| wire perf_tbranch; |
| wire perf_load; |
| wire perf_store; |
| wire illegal_insn_id; |
| wire unused_illegal_insn_id; |
| wire clk; |
| wire clock_en; |
| assign core_busy_d = (ctrl_busy | if_busy) | lsu_busy; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| core_busy_q <= 1'b0; |
| else |
| core_busy_q <= core_busy_d; |
| reg fetch_enable_q; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| fetch_enable_q <= 1'b0; |
| else if (fetch_enable_i) |
| fetch_enable_q <= 1'b1; |
| assign clock_en = fetch_enable_q & (((core_busy_q | debug_req_i) | irq_pending) | irq_nm_i); |
| assign core_sleep_o = ~clock_en; |
| prim_clock_gating core_clock_gate_i( |
| .clk_i(clk_i), |
| .en_i(clock_en), |
| .test_en_i(test_en_i), |
| .clk_o(clk) |
| ); |
| brqrv_ifu #( |
| .DmHaltAddr(DmHaltAddr), |
| .DmExceptionAddr(DmExceptionAddr), |
| .DummyInstructions(DummyInstructions), |
| .ICache(ICache), |
| .ICacheECC(ICacheECC), |
| .SecureBuraq(SecureBuraq), |
| .BranchPredictor(BranchPredictor) |
| ) if_stage_i( |
| .clk_i(clk), |
| .rst_ni(rst_ni), |
| .boot_addr_i(boot_addr_i), |
| .req_i(instr_req_int), |
| .instr_req_o(instr_req_out), |
| .instr_addr_o(instr_addr_o), |
| .instr_gnt_i(instr_gnt_i), |
| .instr_rvalid_i(instr_rvalid_i), |
| .instr_rdata_i(instr_rdata_i), |
| .instr_err_i(instr_err_i), |
| .instr_pmp_err_i(pmp_req_err[PMP_I]), |
| .instr_valid_id_o(instr_valid_id), |
| .instr_new_id_o(instr_new_id), |
| .instr_rdata_id_o(instr_rdata_id), |
| .instr_rdata_alu_id_o(instr_rdata_alu_id), |
| .instr_rdata_c_id_o(instr_rdata_c_id), |
| .instr_is_compressed_id_o(instr_is_compressed_id), |
| .instr_bp_taken_o(instr_bp_taken_id), |
| .instr_fetch_err_o(instr_fetch_err), |
| .instr_fetch_err_plus2_o(instr_fetch_err_plus2), |
| .illegal_c_insn_id_o(illegal_c_insn_id), |
| .dummy_instr_id_o(dummy_instr_id), |
| .pc_if_o(pc_if), |
| .pc_id_o(pc_id), |
| .instr_valid_clear_i(instr_valid_clear), |
| .pc_set_i(pc_set), |
| .pc_set_spec_i(pc_set_spec), |
| .pc_mux_i(pc_mux_id), |
| .nt_branch_mispredict_i(nt_branch_mispredict), |
| .exc_pc_mux_i(exc_pc_mux_id), |
| .exc_cause(exc_cause), |
| .dummy_instr_en_i(dummy_instr_en), |
| .dummy_instr_mask_i(dummy_instr_mask), |
| .dummy_instr_seed_en_i(dummy_instr_seed_en), |
| .dummy_instr_seed_i(dummy_instr_seed), |
| .icache_enable_i(icache_enable), |
| .icache_inval_i(icache_inval), |
| .branch_target_ex_i(branch_target_ex), |
| .csr_mepc_i(csr_mepc), |
| .csr_depc_i(csr_depc), |
| .csr_mtvec_i(csr_mtvec), |
| .csr_mtvec_init_o(csr_mtvec_init), |
| .id_in_ready_i(id_in_ready), |
| .pc_mismatch_alert_o(pc_mismatch_alert), |
| .if_busy_o(if_busy) |
| ); |
| assign perf_iside_wait = id_in_ready & ~instr_valid_id; |
| assign instr_req_o = instr_req_out & ~pmp_req_err[PMP_I]; |
| brqrv_idu #( |
| .RV32E(RV32E), |
| .RV32M(RV32M), |
| .RV32B(RV32B), |
| .BranchTargetALU(BranchTargetALU), |
| .DataIndTiming(DataIndTiming), |
| .SpecBranch(SpecBranch), |
| .WritebackStage(WritebackStage), |
| .BranchPredictor(BranchPredictor) |
| ) id_stage_i( |
| .clk_i(clk), |
| .rst_ni(rst_ni), |
| .ctrl_busy_o(ctrl_busy), |
| .illegal_insn_o(illegal_insn_id), |
| .instr_valid_i(instr_valid_id), |
| .instr_rdata_i(instr_rdata_id), |
| .instr_rdata_alu_i(instr_rdata_alu_id), |
| .instr_rdata_c_i(instr_rdata_c_id), |
| .instr_is_compressed_i(instr_is_compressed_id), |
| .instr_bp_taken_i(instr_bp_taken_id), |
| .branch_decision_i(branch_decision), |
| .instr_first_cycle_id_o(instr_first_cycle_id), |
| .instr_valid_clear_o(instr_valid_clear), |
| .id_in_ready_o(id_in_ready), |
| .instr_req_o(instr_req_int), |
| .pc_set_o(pc_set), |
| .pc_set_spec_o(pc_set_spec), |
| .pc_mux_o(pc_mux_id), |
| .nt_branch_mispredict_o(nt_branch_mispredict), |
| .exc_pc_mux_o(exc_pc_mux_id), |
| .exc_cause_o(exc_cause), |
| .icache_inval_o(icache_inval), |
| .instr_fetch_err_i(instr_fetch_err), |
| .instr_fetch_err_plus2_i(instr_fetch_err_plus2), |
| .illegal_c_insn_i(illegal_c_insn_id), |
| .pc_id_i(pc_id), |
| .ex_valid_i(ex_valid), |
| .lsu_resp_valid_i(lsu_resp_valid), |
| .alu_operator_ex_o(alu_operator_ex), |
| .alu_operand_a_ex_o(alu_operand_a_ex), |
| .alu_operand_b_ex_o(alu_operand_b_ex), |
| .imd_val_q_ex_o(imd_val_q_ex), |
| .imd_val_d_ex_i(imd_val_d_ex), |
| .imd_val_we_ex_i(imd_val_we_ex), |
| .bt_a_operand_o(bt_a_operand), |
| .bt_b_operand_o(bt_b_operand), |
| .mult_en_ex_o(mult_en_ex), |
| .div_en_ex_o(div_en_ex), |
| .mult_sel_ex_o(mult_sel_ex), |
| .div_sel_ex_o(div_sel_ex), |
| .multdiv_operator_ex_o(multdiv_operator_ex), |
| .multdiv_signed_mode_ex_o(multdiv_signed_mode_ex), |
| .multdiv_operand_a_ex_o(multdiv_operand_a_ex), |
| .multdiv_operand_b_ex_o(multdiv_operand_b_ex), |
| .multdiv_ready_id_o(multdiv_ready_id), |
| .csr_access_o(csr_access), |
| .csr_op_o(csr_op), |
| .csr_op_en_o(csr_op_en), |
| .csr_save_if_o(csr_save_if), |
| .csr_save_id_o(csr_save_id), |
| .csr_save_wb_o(csr_save_wb), |
| .csr_restore_mret_id_o(csr_restore_mret_id), |
| .csr_restore_dret_id_o(csr_restore_dret_id), |
| .csr_save_cause_o(csr_save_cause), |
| .csr_mtval_o(csr_mtval), |
| .priv_mode_i(priv_mode_id), |
| .csr_mstatus_tw_i(csr_mstatus_tw), |
| .illegal_csr_insn_i(illegal_csr_insn_id), |
| .data_ind_timing_i(data_ind_timing), |
| .lsu_req_o(lsu_req), |
| .lsu_we_o(lsu_we), |
| .lsu_type_o(lsu_type), |
| .lsu_sign_ext_o(lsu_sign_ext), |
| .lsu_wdata_o(lsu_wdata), |
| .lsu_req_done_i(lsu_req_done), |
| .lsu_addr_incr_req_i(lsu_addr_incr_req), |
| .lsu_addr_last_i(lsu_addr_last), |
| .lsu_load_err_i(lsu_load_err), |
| .lsu_store_err_i(lsu_store_err), |
| .csr_mstatus_mie_i(csr_mstatus_mie), |
| .irq_pending_i(irq_pending), |
| .irqs_i(irqs), |
| .irq_nm_i(irq_nm_i), |
| .nmi_mode_o(nmi_mode), |
| .debug_mode_o(debug_mode), |
| .debug_cause_o(debug_cause), |
| .debug_csr_save_o(debug_csr_save), |
| .debug_req_i(debug_req_i), |
| .debug_single_step_i(debug_single_step), |
| .debug_ebreakm_i(debug_ebreakm), |
| .debug_ebreaku_i(debug_ebreaku), |
| .trigger_match_i(trigger_match), |
| .result_ex_i(result_ex), |
| .csr_rdata_i(csr_rdata), |
| .rf_raddr_a_o(rf_raddr_a), |
| .rf_rdata_a_i(rf_rdata_a), |
| .rf_raddr_b_o(rf_raddr_b), |
| .rf_rdata_b_i(rf_rdata_b), |
| .rf_ren_a_o(rf_ren_a), |
| .rf_ren_b_o(rf_ren_b), |
| .rf_waddr_id_o(rf_waddr_id), |
| .rf_wdata_id_o(rf_wdata_id), |
| .rf_we_id_o(rf_we_id), |
| .rf_rd_a_wb_match_o(rf_rd_a_wb_match), |
| .rf_rd_b_wb_match_o(rf_rd_b_wb_match), |
| .rf_waddr_wb_i(rf_waddr_wb), |
| .rf_wdata_fwd_wb_i(rf_wdata_fwd_wb), |
| .rf_write_wb_i(rf_write_wb), |
| .en_wb_o(en_wb), |
| .instr_type_wb_o(instr_type_wb), |
| .ready_wb_i(ready_wb), |
| .outstanding_load_wb_i(outstanding_load_wb), |
| .outstanding_store_wb_i(outstanding_store_wb), |
| .perf_jump_o(perf_jump), |
| .perf_branch_o(perf_branch), |
| .perf_tbranch_o(perf_tbranch), |
| .perf_dside_wait_o(perf_dside_wait), |
| .perf_mul_wait_o(perf_mul_wait), |
| .perf_div_wait_o(perf_div_wait), |
| .instr_id_done_o(instr_id_done), |
| .instr_id_done_compressed_o(instr_id_done_compressed) |
| ); |
| assign unused_illegal_insn_id = illegal_insn_id; |
| brqrv_exu #( |
| .RV32M(RV32M), |
| .RV32B(RV32B), |
| .BranchTargetALU(BranchTargetALU) |
| ) ex_block_i( |
| .clk_i(clk), |
| .rst_ni(rst_ni), |
| .alu_operator_i(alu_operator_ex), |
| .alu_operand_a_i(alu_operand_a_ex), |
| .alu_operand_b_i(alu_operand_b_ex), |
| .alu_instr_first_cycle_i(instr_first_cycle_id), |
| .bt_a_operand_i(bt_a_operand), |
| .bt_b_operand_i(bt_b_operand), |
| .multdiv_operator_i(multdiv_operator_ex), |
| .mult_en_i(mult_en_ex), |
| .div_en_i(div_en_ex), |
| .mult_sel_i(mult_sel_ex), |
| .div_sel_i(div_sel_ex), |
| .multdiv_signed_mode_i(multdiv_signed_mode_ex), |
| .multdiv_operand_a_i(multdiv_operand_a_ex), |
| .multdiv_operand_b_i(multdiv_operand_b_ex), |
| .multdiv_ready_id_i(multdiv_ready_id), |
| .data_ind_timing_i(data_ind_timing), |
| .imd_val_we_o(imd_val_we_ex), |
| .imd_val_d_o(imd_val_d_ex), |
| .imd_val_q_i(imd_val_q_ex), |
| .alu_adder_result_ex_o(alu_adder_result_ex), |
| .result_ex_o(result_ex), |
| .branch_target_o(branch_target_ex), |
| .branch_decision_o(branch_decision), |
| .ex_valid_o(ex_valid) |
| ); |
| assign data_req_o = data_req_out & ~pmp_req_err[PMP_D]; |
| brqrv_lsu load_store_unit_i( |
| .clk_i(clk), |
| .rst_ni(rst_ni), |
| .data_req_o(data_req_out), |
| .data_gnt_i(data_gnt_i), |
| .data_rvalid_i(data_rvalid_i), |
| .data_err_i(data_err_i), |
| .data_pmp_err_i(pmp_req_err[PMP_D]), |
| .data_addr_o(data_addr_o), |
| .data_we_o(data_we_o), |
| .data_be_o(data_be_o), |
| .data_wdata_o(data_wdata_o), |
| .data_rdata_i(data_rdata_i), |
| .lsu_we_i(lsu_we), |
| .lsu_type_i(lsu_type), |
| .lsu_wdata_i(lsu_wdata), |
| .lsu_sign_ext_i(lsu_sign_ext), |
| .lsu_rdata_o(rf_wdata_lsu), |
| .lsu_rdata_valid_o(rf_we_lsu), |
| .lsu_req_i(lsu_req), |
| .lsu_req_done_o(lsu_req_done), |
| .adder_result_ex_i(alu_adder_result_ex), |
| .addr_incr_req_o(lsu_addr_incr_req), |
| .addr_last_o(lsu_addr_last), |
| .lsu_resp_valid_o(lsu_resp_valid), |
| .load_err_o(lsu_load_err), |
| .store_err_o(lsu_store_err), |
| .busy_o(lsu_busy), |
| .perf_load_o(perf_load), |
| .perf_store_o(perf_store) |
| ); |
| brqrv_wbu #(.WritebackStage(WritebackStage)) wb_stage_i( |
| .clk_i(clk), |
| .rst_ni(rst_ni), |
| .en_wb_i(en_wb), |
| .instr_type_wb_i(instr_type_wb), |
| .pc_id_i(pc_id), |
| .ready_wb_o(ready_wb), |
| .rf_write_wb_o(rf_write_wb), |
| .outstanding_load_wb_o(outstanding_load_wb), |
| .outstanding_store_wb_o(outstanding_store_wb), |
| .pc_wb_o(pc_wb), |
| .rf_waddr_id_i(rf_waddr_id), |
| .rf_wdata_id_i(rf_wdata_id), |
| .rf_we_id_i(rf_we_id), |
| .rf_wdata_lsu_i(rf_wdata_lsu), |
| .rf_we_lsu_i(rf_we_lsu), |
| .rf_wdata_fwd_wb_o(rf_wdata_fwd_wb), |
| .rf_waddr_wb_o(rf_waddr_wb), |
| .rf_wdata_wb_o(rf_wdata_wb), |
| .rf_we_wb_o(rf_we_wb), |
| .lsu_resp_valid_i(lsu_resp_valid), |
| .instr_done_wb_o(instr_done_wb) |
| ); |
| wire [RegFileDataWidth - 1:0] rf_wdata_wb_ecc; |
| wire [RegFileDataWidth - 1:0] rf_rdata_a_ecc; |
| wire [RegFileDataWidth - 1:0] rf_rdata_b_ecc; |
| wire rf_ecc_err_comb; |
| generate |
| if (RegFileECC) begin : gen_regfile_ecc |
| wire [1:0] rf_ecc_err_a; |
| wire [1:0] rf_ecc_err_b; |
| wire rf_ecc_err_a_id; |
| wire rf_ecc_err_b_id; |
| prim_secded_39_32_enc regfile_ecc_enc( |
| .in(rf_wdata_wb), |
| .out(rf_wdata_wb_ecc) |
| ); |
| prim_secded_39_32_dec regfile_ecc_dec_a( |
| .in(rf_rdata_a_ecc), |
| .d_o(), |
| .syndrome_o(), |
| .err_o(rf_ecc_err_a) |
| ); |
| prim_secded_39_32_dec regfile_ecc_dec_b( |
| .in(rf_rdata_b_ecc), |
| .d_o(), |
| .syndrome_o(), |
| .err_o(rf_ecc_err_b) |
| ); |
| assign rf_rdata_a = rf_rdata_a_ecc[31:0]; |
| assign rf_rdata_b = rf_rdata_b_ecc[31:0]; |
| assign rf_ecc_err_a_id = (|rf_ecc_err_a & rf_ren_a) & ~rf_rd_a_wb_match; |
| assign rf_ecc_err_b_id = (|rf_ecc_err_b & rf_ren_b) & ~rf_rd_b_wb_match; |
| assign rf_ecc_err_comb = instr_valid_id & (rf_ecc_err_a_id | rf_ecc_err_b_id); |
| end |
| else begin : gen_no_regfile_ecc |
| wire unused_rf_ren_a; |
| wire unused_rf_ren_b; |
| wire unused_rf_rd_a_wb_match; |
| wire unused_rf_rd_b_wb_match; |
| assign unused_rf_ren_a = rf_ren_a; |
| assign unused_rf_ren_b = rf_ren_b; |
| assign unused_rf_rd_a_wb_match = rf_rd_a_wb_match; |
| assign unused_rf_rd_b_wb_match = rf_rd_b_wb_match; |
| assign rf_wdata_wb_ecc = rf_wdata_wb; |
| assign rf_rdata_a = rf_rdata_a_ecc; |
| assign rf_rdata_b = rf_rdata_b_ecc; |
| assign rf_ecc_err_comb = 1'b0; |
| end |
| endgenerate |
| generate |
| if (RegFile == RegFileFF) begin : gen_regfile_ff |
| brqrv_register_file_ff #( |
| .RV32E(RV32E), |
| .DataWidth(RegFileDataWidth), |
| .DummyInstructions(DummyInstructions) |
| ) register_file_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .test_en_i(test_en_i), |
| .dummy_instr_id_i(dummy_instr_id), |
| .raddr_a_i(rf_raddr_a), |
| .rdata_a_o(rf_rdata_a_ecc), |
| .raddr_b_i(rf_raddr_b), |
| .rdata_b_o(rf_rdata_b_ecc), |
| .waddr_a_i(rf_waddr_wb), |
| .wdata_a_i(rf_wdata_wb_ecc), |
| .we_a_i(rf_we_wb) |
| ); |
| end |
| else if (RegFile == RegFileFPGA) begin : gen_regfile_fpga |
| brqrv_register_file_fpga #( |
| .RV32E(RV32E), |
| .DataWidth(RegFileDataWidth), |
| .DummyInstructions(DummyInstructions) |
| ) register_file_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .test_en_i(test_en_i), |
| .dummy_instr_id_i(dummy_instr_id), |
| .raddr_a_i(rf_raddr_a), |
| .rdata_a_o(rf_rdata_a_ecc), |
| .raddr_b_i(rf_raddr_b), |
| .rdata_b_o(rf_rdata_b_ecc), |
| .waddr_a_i(rf_waddr_wb), |
| .wdata_a_i(rf_wdata_wb_ecc), |
| .we_a_i(rf_we_wb) |
| ); |
| end |
| endgenerate |
| assign alert_minor_o = 1'b0; |
| assign alert_major_o = rf_ecc_err_comb | pc_mismatch_alert; |
| assign csr_wdata = alu_operand_a_ex; |
| function automatic [11:0] sv2v_cast_12; |
| input reg [11:0] inp; |
| sv2v_cast_12 = inp; |
| endfunction |
| assign csr_addr = sv2v_cast_12((csr_access ? alu_operand_b_ex[11:0] : 12'b000000000000)); |
| brqrv_csr #( |
| .DbgTriggerEn(DbgTriggerEn), |
| .DataIndTiming(DataIndTiming), |
| .DummyInstructions(DummyInstructions), |
| .ICache(ICache), |
| .MHPMCounterNum(MHPMCounterNum), |
| .MHPMCounterWidth(MHPMCounterWidth), |
| .PMPEnable(PMPEnable), |
| .PMPGranularity(PMPGranularity), |
| .PMPNumRegions(PMPNumRegions), |
| .RV32E(RV32E), |
| .RV32M(RV32M) |
| ) cs_registers_i( |
| .clk_i(clk), |
| .rst_ni(rst_ni), |
| .hart_id_i(hart_id_i), |
| .priv_mode_id_o(priv_mode_id), |
| .priv_mode_if_o(priv_mode_if), |
| .priv_mode_lsu_o(priv_mode_lsu), |
| .csr_mtvec_o(csr_mtvec), |
| .csr_mtvec_init_i(csr_mtvec_init), |
| .boot_addr_i(boot_addr_i), |
| .csr_access_i(csr_access), |
| .csr_addr_i(csr_addr), |
| .csr_wdata_i(csr_wdata), |
| .csr_op_i(csr_op), |
| .csr_op_en_i(csr_op_en), |
| .csr_rdata_o(csr_rdata), |
| .irq_software_i(irq_software_i), |
| .irq_timer_i(irq_timer_i), |
| .irq_external_i(irq_external_i), |
| .irq_fast_i(irq_fast_i), |
| .nmi_mode_i(nmi_mode), |
| .irq_pending_o(irq_pending), |
| .irqs_o(irqs), |
| .csr_mstatus_mie_o(csr_mstatus_mie), |
| .csr_mstatus_tw_o(csr_mstatus_tw), |
| .csr_mepc_o(csr_mepc), |
| .csr_pmp_cfg_o(csr_pmp_cfg), |
| .csr_pmp_addr_o(csr_pmp_addr), |
| .csr_depc_o(csr_depc), |
| .debug_mode_i(debug_mode), |
| .debug_cause_i(debug_cause), |
| .debug_csr_save_i(debug_csr_save), |
| .debug_single_step_o(debug_single_step), |
| .debug_ebreakm_o(debug_ebreakm), |
| .debug_ebreaku_o(debug_ebreaku), |
| .trigger_match_o(trigger_match), |
| .pc_if_i(pc_if), |
| .pc_id_i(pc_id), |
| .pc_wb_i(pc_wb), |
| .data_ind_timing_o(data_ind_timing), |
| .dummy_instr_en_o(dummy_instr_en), |
| .dummy_instr_mask_o(dummy_instr_mask), |
| .dummy_instr_seed_en_o(dummy_instr_seed_en), |
| .dummy_instr_seed_o(dummy_instr_seed), |
| .icache_enable_o(icache_enable), |
| .csr_save_if_i(csr_save_if), |
| .csr_save_id_i(csr_save_id), |
| .csr_save_wb_i(csr_save_wb), |
| .csr_restore_mret_i(csr_restore_mret_id), |
| .csr_restore_dret_i(csr_restore_dret_id), |
| .csr_save_cause_i(csr_save_cause), |
| .csr_mcause_i(exc_cause), |
| .csr_mtval_i(csr_mtval), |
| .illegal_csr_insn_o(illegal_csr_insn_id), |
| .instr_ret_i(instr_id_done), |
| .instr_ret_compressed_i(instr_id_done_compressed), |
| .iside_wait_i(perf_iside_wait), |
| .jump_i(perf_jump), |
| .branch_i(perf_branch), |
| .branch_taken_i(perf_tbranch), |
| .mem_load_i(perf_load), |
| .mem_store_i(perf_store), |
| .dside_wait_i(perf_dside_wait), |
| .mul_wait_i(perf_mul_wait), |
| .div_wait_i(perf_div_wait) |
| ); |
| generate |
| if (PMPEnable) begin : g_pmp |
| wire [(PMP_NUM_CHAN * 34) - 1:0] pmp_req_addr; |
| wire [(PMP_NUM_CHAN * 2) - 1:0] pmp_req_type; |
| wire [(PMP_NUM_CHAN * 2) - 1:0] pmp_priv_lvl; |
| assign pmp_req_addr[((PMP_NUM_CHAN - 1) - PMP_I) * 34+:34] = {2'b00, instr_addr_o[31:0]}; |
| assign pmp_req_type[((PMP_NUM_CHAN - 1) - PMP_I) * 2+:2] = PMP_ACC_EXEC; |
| assign pmp_priv_lvl[((PMP_NUM_CHAN - 1) - PMP_I) * 2+:2] = priv_mode_if; |
| assign pmp_req_addr[((PMP_NUM_CHAN - 1) - PMP_D) * 34+:34] = {2'b00, data_addr_o[31:0]}; |
| assign pmp_req_type[((PMP_NUM_CHAN - 1) - PMP_D) * 2+:2] = (data_we_o ? PMP_ACC_WRITE : PMP_ACC_READ); |
| assign pmp_priv_lvl[((PMP_NUM_CHAN - 1) - PMP_D) * 2+:2] = priv_mode_lsu; |
| brqrv_pmp #( |
| .PMPGranularity(PMPGranularity), |
| .PMPNumChan(PMP_NUM_CHAN), |
| .PMPNumRegions(PMPNumRegions) |
| ) pmp_i( |
| .clk_i(clk), |
| .rst_ni(rst_ni), |
| .csr_pmp_cfg_i(csr_pmp_cfg), |
| .csr_pmp_addr_i(csr_pmp_addr), |
| .priv_mode_i(pmp_priv_lvl), |
| .pmp_req_addr_i(pmp_req_addr), |
| .pmp_req_type_i(pmp_req_type), |
| .pmp_req_err_o(pmp_req_err) |
| ); |
| end |
| else begin : g_no_pmp |
| wire [1:0] unused_priv_lvl_if; |
| wire [1:0] unused_priv_lvl_ls; |
| wire [(0 >= (PMPNumRegions - 1) ? ((2 - PMPNumRegions) * 34) + (((PMPNumRegions - 1) * 34) - 1) : (PMPNumRegions * 34) - 1):(0 >= (PMPNumRegions - 1) ? (PMPNumRegions - 1) * 34 : 0)] unused_csr_pmp_addr; |
| wire [(0 >= (PMPNumRegions - 1) ? ((2 - PMPNumRegions) * 6) + (((PMPNumRegions - 1) * 6) - 1) : (PMPNumRegions * 6) - 1):(0 >= (PMPNumRegions - 1) ? (PMPNumRegions - 1) * 6 : 0)] unused_csr_pmp_cfg; |
| assign unused_priv_lvl_if = priv_mode_if; |
| assign unused_priv_lvl_ls = priv_mode_lsu; |
| assign unused_csr_pmp_addr = csr_pmp_addr; |
| assign unused_csr_pmp_cfg = csr_pmp_cfg; |
| assign pmp_req_err[PMP_I] = 1'b0; |
| assign pmp_req_err[PMP_D] = 1'b0; |
| end |
| endgenerate |
| endmodule |
| module brqrv_csr ( |
| clk_i, |
| rst_ni, |
| hart_id_i, |
| priv_mode_id_o, |
| priv_mode_if_o, |
| priv_mode_lsu_o, |
| csr_mstatus_tw_o, |
| csr_mtvec_o, |
| csr_mtvec_init_i, |
| boot_addr_i, |
| csr_access_i, |
| csr_addr_i, |
| csr_wdata_i, |
| csr_op_i, |
| csr_op_en_i, |
| csr_rdata_o, |
| irq_software_i, |
| irq_timer_i, |
| irq_external_i, |
| irq_fast_i, |
| nmi_mode_i, |
| irq_pending_o, |
| irqs_o, |
| csr_mstatus_mie_o, |
| csr_mepc_o, |
| csr_pmp_cfg_o, |
| csr_pmp_addr_o, |
| debug_mode_i, |
| debug_cause_i, |
| debug_csr_save_i, |
| csr_depc_o, |
| debug_single_step_o, |
| debug_ebreakm_o, |
| debug_ebreaku_o, |
| trigger_match_o, |
| pc_if_i, |
| pc_id_i, |
| pc_wb_i, |
| data_ind_timing_o, |
| dummy_instr_en_o, |
| dummy_instr_mask_o, |
| dummy_instr_seed_en_o, |
| dummy_instr_seed_o, |
| icache_enable_o, |
| csr_save_if_i, |
| csr_save_id_i, |
| csr_save_wb_i, |
| csr_restore_mret_i, |
| csr_restore_dret_i, |
| csr_save_cause_i, |
| csr_mcause_i, |
| csr_mtval_i, |
| illegal_csr_insn_o, |
| instr_ret_i, |
| instr_ret_compressed_i, |
| iside_wait_i, |
| jump_i, |
| branch_i, |
| branch_taken_i, |
| mem_load_i, |
| mem_store_i, |
| dside_wait_i, |
| mul_wait_i, |
| div_wait_i |
| ); |
| parameter [0:0] DbgTriggerEn = 0; |
| parameter [0:0] DataIndTiming = 1'b0; |
| parameter [0:0] DummyInstructions = 1'b0; |
| parameter [0:0] ICache = 1'b0; |
| parameter [31:0] MHPMCounterNum = 10; |
| parameter [31:0] MHPMCounterWidth = 40; |
| parameter [0:0] PMPEnable = 0; |
| parameter [31:0] PMPGranularity = 0; |
| parameter [31:0] PMPNumRegions = 4; |
| parameter [0:0] RV32E = 0; |
| localparam integer brqrv_pkg_RV32MFast = 2; |
| parameter integer RV32M = brqrv_pkg_RV32MFast; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire [31:0] hart_id_i; |
| output wire [1:0] priv_mode_id_o; |
| output wire [1:0] priv_mode_if_o; |
| output wire [1:0] priv_mode_lsu_o; |
| output wire csr_mstatus_tw_o; |
| output wire [31:0] csr_mtvec_o; |
| input wire csr_mtvec_init_i; |
| input wire [31:0] boot_addr_i; |
| input wire csr_access_i; |
| input wire [11:0] csr_addr_i; |
| input wire [31:0] csr_wdata_i; |
| input wire [1:0] csr_op_i; |
| input csr_op_en_i; |
| output wire [31:0] csr_rdata_o; |
| input wire irq_software_i; |
| input wire irq_timer_i; |
| input wire irq_external_i; |
| input wire [14:0] irq_fast_i; |
| input wire nmi_mode_i; |
| output wire irq_pending_o; |
| output wire [17:0] irqs_o; |
| output wire csr_mstatus_mie_o; |
| output wire [31:0] csr_mepc_o; |
| output wire [(0 >= (PMPNumRegions - 1) ? ((2 - PMPNumRegions) * 6) + (((PMPNumRegions - 1) * 6) - 1) : (PMPNumRegions * 6) - 1):(0 >= (PMPNumRegions - 1) ? (PMPNumRegions - 1) * 6 : 0)] csr_pmp_cfg_o; |
| output wire [(0 >= (PMPNumRegions - 1) ? ((2 - PMPNumRegions) * 34) + (((PMPNumRegions - 1) * 34) - 1) : (PMPNumRegions * 34) - 1):(0 >= (PMPNumRegions - 1) ? (PMPNumRegions - 1) * 34 : 0)] csr_pmp_addr_o; |
| input wire debug_mode_i; |
| input wire [2:0] debug_cause_i; |
| input wire debug_csr_save_i; |
| output wire [31:0] csr_depc_o; |
| output wire debug_single_step_o; |
| output wire debug_ebreakm_o; |
| output wire debug_ebreaku_o; |
| output wire trigger_match_o; |
| input wire [31:0] pc_if_i; |
| input wire [31:0] pc_id_i; |
| input wire [31:0] pc_wb_i; |
| output wire data_ind_timing_o; |
| output wire dummy_instr_en_o; |
| output wire [2:0] dummy_instr_mask_o; |
| output wire dummy_instr_seed_en_o; |
| output wire [31:0] dummy_instr_seed_o; |
| output wire icache_enable_o; |
| input wire csr_save_if_i; |
| input wire csr_save_id_i; |
| input wire csr_save_wb_i; |
| input wire csr_restore_mret_i; |
| input wire csr_restore_dret_i; |
| input wire csr_save_cause_i; |
| input wire [5:0] csr_mcause_i; |
| input wire [31:0] csr_mtval_i; |
| output wire illegal_csr_insn_o; |
| input wire instr_ret_i; |
| input wire instr_ret_compressed_i; |
| input wire iside_wait_i; |
| input wire jump_i; |
| input wire branch_i; |
| input wire branch_taken_i; |
| input wire mem_load_i; |
| input wire mem_store_i; |
| input wire dside_wait_i; |
| input wire mul_wait_i; |
| input wire div_wait_i; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| localparam [31:0] RV32MEnabled = (RV32M == RV32MNone ? 0 : 1); |
| function automatic [31:0] sv2v_cast_32; |
| input reg [31:0] inp; |
| sv2v_cast_32 = inp; |
| endfunction |
| localparam [31:0] MISA_VALUE = ((((((((((0 | 4) | 0) | (sv2v_cast_32(RV32E) << 4)) | 0) | (sv2v_cast_32(!RV32E) << 8)) | (RV32MEnabled << 12)) | 0) | 0) | 1048576) | 0) | (sv2v_cast_32(CSR_MISA_MXL) << 30); |
| reg [31:0] exception_pc; |
| reg [1:0] priv_lvl_q; |
| reg [1:0] priv_lvl_d; |
| reg [5:0] mstatus_q; |
| reg [5:0] mstatus_d; |
| reg [17:0] mie_q; |
| reg [17:0] mie_d; |
| reg [31:0] mscratch_q; |
| reg [31:0] mscratch_d; |
| reg [31:0] mepc_q; |
| reg [31:0] mepc_d; |
| reg [5:0] mcause_q; |
| reg [5:0] mcause_d; |
| reg [31:0] mtval_q; |
| reg [31:0] mtval_d; |
| reg [31:0] mtvec_q; |
| reg [31:0] mtvec_d; |
| wire [17:0] mip; |
| reg [31:0] dcsr_q; |
| reg [31:0] dcsr_d; |
| reg [31:0] depc_q; |
| reg [31:0] depc_d; |
| reg [31:0] dscratch0_q; |
| reg [31:0] dscratch0_d; |
| reg [31:0] dscratch1_q; |
| reg [31:0] dscratch1_d; |
| reg [2:0] mstack_q; |
| reg [2:0] mstack_d; |
| reg [31:0] mstack_epc_q; |
| reg [31:0] mstack_epc_d; |
| reg [5:0] mstack_cause_q; |
| reg [5:0] mstack_cause_d; |
| reg [31:0] pmp_addr_rdata [0:PMP_MAX_REGIONS - 1]; |
| wire [PMP_CFG_W - 1:0] pmp_cfg_rdata [0:PMP_MAX_REGIONS - 1]; |
| wire [31:0] mcountinhibit; |
| reg [MHPMCounterNum + 2:0] mcountinhibit_d; |
| reg [MHPMCounterNum + 2:0] mcountinhibit_q; |
| reg mcountinhibit_we; |
| wire [63:0] mhpmcounter [0:31]; |
| reg [31:0] mhpmcounter_we; |
| reg [31:0] mhpmcounterh_we; |
| reg [31:0] mhpmcounter_incr; |
| reg [31:0] mhpmevent [0:31]; |
| wire [4:0] mhpmcounter_idx; |
| wire [31:0] tselect_rdata; |
| wire [31:0] tmatch_control_rdata; |
| wire [31:0] tmatch_value_rdata; |
| wire [31:0] cpuctrl_rdata; |
| wire [31:0] cpuctrl_wdata; |
| reg [31:0] csr_wdata_int; |
| reg [31:0] csr_rdata_int; |
| wire csr_we_int; |
| wire csr_wreq; |
| reg illegal_csr; |
| wire illegal_csr_priv; |
| wire illegal_csr_write; |
| wire [7:0] unused_boot_addr; |
| wire [2:0] unused_csr_addr; |
| assign unused_boot_addr = boot_addr_i[7:0]; |
| wire [11:0] csr_addr; |
| assign csr_addr = csr_addr_i; |
| assign unused_csr_addr = csr_addr[7:5]; |
| assign mhpmcounter_idx = csr_addr[4:0]; |
| assign illegal_csr_priv = csr_addr[9:8] > priv_lvl_q; |
| assign illegal_csr_write = (csr_addr[11:10] == 2'b11) && csr_wreq; |
| assign illegal_csr_insn_o = csr_access_i & ((illegal_csr | illegal_csr_write) | illegal_csr_priv); |
| assign mip[17] = irq_software_i; |
| assign mip[16] = irq_timer_i; |
| assign mip[15] = irq_external_i; |
| assign mip[14-:15] = irq_fast_i; |
| always @(*) begin |
| csr_rdata_int = {32 {1'sb0}}; |
| illegal_csr = 1'b0; |
| case (csr_addr_i) |
| CSR_MHARTID: csr_rdata_int = hart_id_i; |
| CSR_MSTATUS: begin |
| csr_rdata_int = {32 {1'sb0}}; |
| csr_rdata_int[CSR_MSTATUS_MIE_BIT] = mstatus_q[5]; |
| csr_rdata_int[CSR_MSTATUS_MPIE_BIT] = mstatus_q[4]; |
| csr_rdata_int[CSR_MSTATUS_MPP_BIT_HIGH:CSR_MSTATUS_MPP_BIT_LOW] = mstatus_q[3-:2]; |
| csr_rdata_int[CSR_MSTATUS_MPRV_BIT] = mstatus_q[1]; |
| csr_rdata_int[CSR_MSTATUS_TW_BIT] = mstatus_q[0]; |
| end |
| CSR_MISA: csr_rdata_int = MISA_VALUE; |
| CSR_MIE: begin |
| csr_rdata_int = {32 {1'sb0}}; |
| csr_rdata_int[CSR_MSIX_BIT] = mie_q[17]; |
| csr_rdata_int[CSR_MTIX_BIT] = mie_q[16]; |
| csr_rdata_int[CSR_MEIX_BIT] = mie_q[15]; |
| csr_rdata_int[CSR_MFIX_BIT_HIGH:CSR_MFIX_BIT_LOW] = mie_q[14-:15]; |
| end |
| CSR_MSCRATCH: csr_rdata_int = mscratch_q; |
| CSR_MTVEC: csr_rdata_int = mtvec_q; |
| CSR_MEPC: csr_rdata_int = mepc_q; |
| CSR_MCAUSE: csr_rdata_int = {mcause_q[5], 26'b00000000000000000000000000, mcause_q[4:0]}; |
| CSR_MTVAL: csr_rdata_int = mtval_q; |
| CSR_MIP: begin |
| csr_rdata_int = {32 {1'sb0}}; |
| csr_rdata_int[CSR_MSIX_BIT] = mip[17]; |
| csr_rdata_int[CSR_MTIX_BIT] = mip[16]; |
| csr_rdata_int[CSR_MEIX_BIT] = mip[15]; |
| csr_rdata_int[CSR_MFIX_BIT_HIGH:CSR_MFIX_BIT_LOW] = mip[14-:15]; |
| end |
| CSR_PMPCFG0: csr_rdata_int = {pmp_cfg_rdata[3], pmp_cfg_rdata[2], pmp_cfg_rdata[1], pmp_cfg_rdata[0]}; |
| CSR_PMPCFG1: csr_rdata_int = {pmp_cfg_rdata[7], pmp_cfg_rdata[6], pmp_cfg_rdata[5], pmp_cfg_rdata[4]}; |
| CSR_PMPCFG2: csr_rdata_int = {pmp_cfg_rdata[11], pmp_cfg_rdata[10], pmp_cfg_rdata[9], pmp_cfg_rdata[8]}; |
| CSR_PMPCFG3: csr_rdata_int = {pmp_cfg_rdata[15], pmp_cfg_rdata[14], pmp_cfg_rdata[13], pmp_cfg_rdata[12]}; |
| CSR_PMPADDR0: csr_rdata_int = pmp_addr_rdata[0]; |
| CSR_PMPADDR1: csr_rdata_int = pmp_addr_rdata[1]; |
| CSR_PMPADDR2: csr_rdata_int = pmp_addr_rdata[2]; |
| CSR_PMPADDR3: csr_rdata_int = pmp_addr_rdata[3]; |
| CSR_PMPADDR4: csr_rdata_int = pmp_addr_rdata[4]; |
| CSR_PMPADDR5: csr_rdata_int = pmp_addr_rdata[5]; |
| CSR_PMPADDR6: csr_rdata_int = pmp_addr_rdata[6]; |
| CSR_PMPADDR7: csr_rdata_int = pmp_addr_rdata[7]; |
| CSR_PMPADDR8: csr_rdata_int = pmp_addr_rdata[8]; |
| CSR_PMPADDR9: csr_rdata_int = pmp_addr_rdata[9]; |
| CSR_PMPADDR10: csr_rdata_int = pmp_addr_rdata[10]; |
| CSR_PMPADDR11: csr_rdata_int = pmp_addr_rdata[11]; |
| CSR_PMPADDR12: csr_rdata_int = pmp_addr_rdata[12]; |
| CSR_PMPADDR13: csr_rdata_int = pmp_addr_rdata[13]; |
| CSR_PMPADDR14: csr_rdata_int = pmp_addr_rdata[14]; |
| CSR_PMPADDR15: csr_rdata_int = pmp_addr_rdata[15]; |
| CSR_DCSR: begin |
| csr_rdata_int = dcsr_q; |
| illegal_csr = ~debug_mode_i; |
| end |
| CSR_DPC: begin |
| csr_rdata_int = depc_q; |
| illegal_csr = ~debug_mode_i; |
| end |
| CSR_DSCRATCH0: begin |
| csr_rdata_int = dscratch0_q; |
| illegal_csr = ~debug_mode_i; |
| end |
| CSR_DSCRATCH1: begin |
| csr_rdata_int = dscratch1_q; |
| illegal_csr = ~debug_mode_i; |
| end |
| CSR_MCOUNTINHIBIT: csr_rdata_int = mcountinhibit; |
| CSR_MHPMEVENT3, CSR_MHPMEVENT4, CSR_MHPMEVENT5, CSR_MHPMEVENT6, CSR_MHPMEVENT7, CSR_MHPMEVENT8, CSR_MHPMEVENT9, CSR_MHPMEVENT10, CSR_MHPMEVENT11, CSR_MHPMEVENT12, CSR_MHPMEVENT13, CSR_MHPMEVENT14, CSR_MHPMEVENT15, CSR_MHPMEVENT16, CSR_MHPMEVENT17, CSR_MHPMEVENT18, CSR_MHPMEVENT19, CSR_MHPMEVENT20, CSR_MHPMEVENT21, CSR_MHPMEVENT22, CSR_MHPMEVENT23, CSR_MHPMEVENT24, CSR_MHPMEVENT25, CSR_MHPMEVENT26, CSR_MHPMEVENT27, CSR_MHPMEVENT28, CSR_MHPMEVENT29, CSR_MHPMEVENT30, CSR_MHPMEVENT31: csr_rdata_int = mhpmevent[mhpmcounter_idx]; |
| CSR_MCYCLE, CSR_MINSTRET, CSR_MHPMCOUNTER3, CSR_MHPMCOUNTER4, CSR_MHPMCOUNTER5, CSR_MHPMCOUNTER6, CSR_MHPMCOUNTER7, CSR_MHPMCOUNTER8, CSR_MHPMCOUNTER9, CSR_MHPMCOUNTER10, CSR_MHPMCOUNTER11, CSR_MHPMCOUNTER12, CSR_MHPMCOUNTER13, CSR_MHPMCOUNTER14, CSR_MHPMCOUNTER15, CSR_MHPMCOUNTER16, CSR_MHPMCOUNTER17, CSR_MHPMCOUNTER18, CSR_MHPMCOUNTER19, CSR_MHPMCOUNTER20, CSR_MHPMCOUNTER21, CSR_MHPMCOUNTER22, CSR_MHPMCOUNTER23, CSR_MHPMCOUNTER24, CSR_MHPMCOUNTER25, CSR_MHPMCOUNTER26, CSR_MHPMCOUNTER27, CSR_MHPMCOUNTER28, CSR_MHPMCOUNTER29, CSR_MHPMCOUNTER30, CSR_MHPMCOUNTER31: csr_rdata_int = mhpmcounter[mhpmcounter_idx][31:0]; |
| CSR_MCYCLEH, CSR_MINSTRETH, CSR_MHPMCOUNTER3H, CSR_MHPMCOUNTER4H, CSR_MHPMCOUNTER5H, CSR_MHPMCOUNTER6H, CSR_MHPMCOUNTER7H, CSR_MHPMCOUNTER8H, CSR_MHPMCOUNTER9H, CSR_MHPMCOUNTER10H, CSR_MHPMCOUNTER11H, CSR_MHPMCOUNTER12H, CSR_MHPMCOUNTER13H, CSR_MHPMCOUNTER14H, CSR_MHPMCOUNTER15H, CSR_MHPMCOUNTER16H, CSR_MHPMCOUNTER17H, CSR_MHPMCOUNTER18H, CSR_MHPMCOUNTER19H, CSR_MHPMCOUNTER20H, CSR_MHPMCOUNTER21H, CSR_MHPMCOUNTER22H, CSR_MHPMCOUNTER23H, CSR_MHPMCOUNTER24H, CSR_MHPMCOUNTER25H, CSR_MHPMCOUNTER26H, CSR_MHPMCOUNTER27H, CSR_MHPMCOUNTER28H, CSR_MHPMCOUNTER29H, CSR_MHPMCOUNTER30H, CSR_MHPMCOUNTER31H: csr_rdata_int = mhpmcounter[mhpmcounter_idx][63:32]; |
| CSR_TSELECT: begin |
| csr_rdata_int = tselect_rdata; |
| illegal_csr = ~DbgTriggerEn; |
| end |
| CSR_TDATA1: begin |
| csr_rdata_int = tmatch_control_rdata; |
| illegal_csr = ~DbgTriggerEn; |
| end |
| CSR_TDATA2: begin |
| csr_rdata_int = tmatch_value_rdata; |
| illegal_csr = ~DbgTriggerEn; |
| end |
| CSR_TDATA3: begin |
| csr_rdata_int = {32 {1'sb0}}; |
| illegal_csr = ~DbgTriggerEn; |
| end |
| CSR_MCONTEXT: begin |
| csr_rdata_int = {32 {1'sb0}}; |
| illegal_csr = ~DbgTriggerEn; |
| end |
| CSR_SCONTEXT: begin |
| csr_rdata_int = {32 {1'sb0}}; |
| illegal_csr = ~DbgTriggerEn; |
| end |
| CSR_CPUCTRL: csr_rdata_int = cpuctrl_rdata; |
| CSR_SECURESEED: csr_rdata_int = {32 {1'sb0}}; |
| default: illegal_csr = 1'b1; |
| endcase |
| end |
| function automatic [0:0] sv2v_cast_1; |
| input reg [0:0] inp; |
| sv2v_cast_1 = inp; |
| endfunction |
| function automatic [1:0] sv2v_cast_2; |
| input reg [1:0] inp; |
| sv2v_cast_2 = inp; |
| endfunction |
| always @(*) begin |
| exception_pc = pc_id_i; |
| priv_lvl_d = priv_lvl_q; |
| mstatus_d = mstatus_q; |
| mie_d = mie_q; |
| mscratch_d = mscratch_q; |
| mepc_d = mepc_q; |
| mcause_d = mcause_q; |
| mtval_d = mtval_q; |
| mtvec_d = (csr_mtvec_init_i ? {boot_addr_i[31:8], 6'b000000, 2'b01} : mtvec_q); |
| dcsr_d = dcsr_q; |
| depc_d = depc_q; |
| dscratch0_d = dscratch0_q; |
| dscratch1_d = dscratch1_q; |
| mstack_d = mstack_q; |
| mstack_epc_d = mstack_epc_q; |
| mstack_cause_d = mstack_cause_q; |
| mcountinhibit_we = 1'b0; |
| mhpmcounter_we = {32 {1'sb0}}; |
| mhpmcounterh_we = {32 {1'sb0}}; |
| if (csr_we_int) |
| case (csr_addr_i) |
| CSR_MSTATUS: begin |
| mstatus_d = {sv2v_cast_1(csr_wdata_int[CSR_MSTATUS_MIE_BIT]), sv2v_cast_1(csr_wdata_int[CSR_MSTATUS_MPIE_BIT]), sv2v_cast_2(sv2v_cast_2(csr_wdata_int[CSR_MSTATUS_MPP_BIT_HIGH:CSR_MSTATUS_MPP_BIT_LOW])), sv2v_cast_1(csr_wdata_int[CSR_MSTATUS_MPRV_BIT]), sv2v_cast_1(csr_wdata_int[CSR_MSTATUS_TW_BIT])}; |
| if ((mstatus_d[3-:2] != PRIV_LVL_M) && (mstatus_d[3-:2] != PRIV_LVL_U)) |
| mstatus_d[3-:2] = PRIV_LVL_M; |
| end |
| CSR_MIE: begin |
| mie_d[17] = csr_wdata_int[CSR_MSIX_BIT]; |
| mie_d[16] = csr_wdata_int[CSR_MTIX_BIT]; |
| mie_d[15] = csr_wdata_int[CSR_MEIX_BIT]; |
| mie_d[14-:15] = csr_wdata_int[CSR_MFIX_BIT_HIGH:CSR_MFIX_BIT_LOW]; |
| end |
| CSR_MSCRATCH: mscratch_d = csr_wdata_int; |
| CSR_MEPC: mepc_d = {csr_wdata_int[31:1], 1'b0}; |
| CSR_MCAUSE: mcause_d = {csr_wdata_int[31], csr_wdata_int[4:0]}; |
| CSR_MTVAL: mtval_d = csr_wdata_int; |
| CSR_MTVEC: mtvec_d = {csr_wdata_int[31:8], 6'b000000, 2'b01}; |
| CSR_DCSR: begin |
| dcsr_d = csr_wdata_int; |
| dcsr_d[31-:4] = XDEBUGVER_STD; |
| if ((dcsr_d[1-:2] != PRIV_LVL_M) && (dcsr_d[1-:2] != PRIV_LVL_U)) |
| dcsr_d[1-:2] = PRIV_LVL_M; |
| dcsr_d[3] = 1'b0; |
| dcsr_d[4] = 1'b0; |
| dcsr_d[10] = 1'b0; |
| dcsr_d[9] = 1'b0; |
| dcsr_d[5] = 1'b0; |
| dcsr_d[14] = 1'b0; |
| dcsr_d[27-:12] = 12'h000; |
| end |
| CSR_DPC: depc_d = {csr_wdata_int[31:1], 1'b0}; |
| CSR_DSCRATCH0: dscratch0_d = csr_wdata_int; |
| CSR_DSCRATCH1: dscratch1_d = csr_wdata_int; |
| CSR_MCOUNTINHIBIT: mcountinhibit_we = 1'b1; |
| CSR_MCYCLE, CSR_MINSTRET, CSR_MHPMCOUNTER3, CSR_MHPMCOUNTER4, CSR_MHPMCOUNTER5, CSR_MHPMCOUNTER6, CSR_MHPMCOUNTER7, CSR_MHPMCOUNTER8, CSR_MHPMCOUNTER9, CSR_MHPMCOUNTER10, CSR_MHPMCOUNTER11, CSR_MHPMCOUNTER12, CSR_MHPMCOUNTER13, CSR_MHPMCOUNTER14, CSR_MHPMCOUNTER15, CSR_MHPMCOUNTER16, CSR_MHPMCOUNTER17, CSR_MHPMCOUNTER18, CSR_MHPMCOUNTER19, CSR_MHPMCOUNTER20, CSR_MHPMCOUNTER21, CSR_MHPMCOUNTER22, CSR_MHPMCOUNTER23, CSR_MHPMCOUNTER24, CSR_MHPMCOUNTER25, CSR_MHPMCOUNTER26, CSR_MHPMCOUNTER27, CSR_MHPMCOUNTER28, CSR_MHPMCOUNTER29, CSR_MHPMCOUNTER30, CSR_MHPMCOUNTER31: mhpmcounter_we[mhpmcounter_idx] = 1'b1; |
| CSR_MCYCLEH, CSR_MINSTRETH, CSR_MHPMCOUNTER3H, CSR_MHPMCOUNTER4H, CSR_MHPMCOUNTER5H, CSR_MHPMCOUNTER6H, CSR_MHPMCOUNTER7H, CSR_MHPMCOUNTER8H, CSR_MHPMCOUNTER9H, CSR_MHPMCOUNTER10H, CSR_MHPMCOUNTER11H, CSR_MHPMCOUNTER12H, CSR_MHPMCOUNTER13H, CSR_MHPMCOUNTER14H, CSR_MHPMCOUNTER15H, CSR_MHPMCOUNTER16H, CSR_MHPMCOUNTER17H, CSR_MHPMCOUNTER18H, CSR_MHPMCOUNTER19H, CSR_MHPMCOUNTER20H, CSR_MHPMCOUNTER21H, CSR_MHPMCOUNTER22H, CSR_MHPMCOUNTER23H, CSR_MHPMCOUNTER24H, CSR_MHPMCOUNTER25H, CSR_MHPMCOUNTER26H, CSR_MHPMCOUNTER27H, CSR_MHPMCOUNTER28H, CSR_MHPMCOUNTER29H, CSR_MHPMCOUNTER30H, CSR_MHPMCOUNTER31H: mhpmcounterh_we[mhpmcounter_idx] = 1'b1; |
| default: |
| ; |
| endcase |
| case (1'b1) |
| csr_save_cause_i: begin |
| case (1'b1) |
| csr_save_if_i: exception_pc = pc_if_i; |
| csr_save_id_i: exception_pc = pc_id_i; |
| csr_save_wb_i: exception_pc = pc_wb_i; |
| default: |
| ; |
| endcase |
| priv_lvl_d = PRIV_LVL_M; |
| if (debug_csr_save_i) begin |
| dcsr_d[1-:2] = priv_lvl_q; |
| dcsr_d[8-:3] = debug_cause_i; |
| depc_d = exception_pc; |
| end |
| else if (!debug_mode_i) begin |
| mtval_d = csr_mtval_i; |
| mstatus_d[5] = 1'b0; |
| mstatus_d[4] = mstatus_q[5]; |
| mstatus_d[3-:2] = priv_lvl_q; |
| mepc_d = exception_pc; |
| mcause_d = csr_mcause_i; |
| mstack_d[2] = mstatus_q[4]; |
| mstack_d[1-:2] = mstatus_q[3-:2]; |
| mstack_epc_d = mepc_q; |
| mstack_cause_d = mcause_q; |
| end |
| end |
| csr_restore_dret_i: priv_lvl_d = dcsr_q[1-:2]; |
| csr_restore_mret_i: begin |
| priv_lvl_d = mstatus_q[3-:2]; |
| mstatus_d[5] = mstatus_q[4]; |
| if (nmi_mode_i) begin |
| mstatus_d[4] = mstack_q[2]; |
| mstatus_d[3-:2] = mstack_q[1-:2]; |
| mepc_d = mstack_epc_q; |
| mcause_d = mstack_cause_q; |
| end |
| else begin |
| mstatus_d[4] = 1'b1; |
| mstatus_d[3-:2] = PRIV_LVL_U; |
| end |
| end |
| default: |
| ; |
| endcase |
| end |
| always @(*) |
| case (csr_op_i) |
| CSR_OP_WRITE: csr_wdata_int = csr_wdata_i; |
| CSR_OP_SET: csr_wdata_int = csr_wdata_i | csr_rdata_o; |
| CSR_OP_CLEAR: csr_wdata_int = ~csr_wdata_i & csr_rdata_o; |
| CSR_OP_READ: csr_wdata_int = csr_wdata_i; |
| default: csr_wdata_int = csr_wdata_i; |
| endcase |
| assign csr_wreq = csr_op_en_i & |{csr_op_i == CSR_OP_WRITE, csr_op_i == CSR_OP_SET, csr_op_i == CSR_OP_CLEAR}; |
| assign csr_we_int = csr_wreq & ~illegal_csr_insn_o; |
| assign csr_rdata_o = csr_rdata_int; |
| assign csr_mepc_o = mepc_q; |
| assign csr_depc_o = depc_q; |
| assign csr_mtvec_o = mtvec_q; |
| assign csr_mstatus_mie_o = mstatus_q[5]; |
| assign csr_mstatus_tw_o = mstatus_q[0]; |
| assign debug_single_step_o = dcsr_q[2]; |
| assign debug_ebreakm_o = dcsr_q[15]; |
| assign debug_ebreaku_o = dcsr_q[12]; |
| assign irqs_o = mip & mie_q; |
| assign irq_pending_o = |irqs_o; |
| function automatic [3:0] sv2v_cast_4; |
| input reg [3:0] inp; |
| sv2v_cast_4 = inp; |
| endfunction |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| priv_lvl_q <= PRIV_LVL_M; |
| mstatus_q <= {1'b0, 1'b1, sv2v_cast_2(PRIV_LVL_U), 1'b0, 1'b0}; |
| mie_q <= {18 {1'sb0}}; |
| mscratch_q <= {32 {1'sb0}}; |
| mepc_q <= {32 {1'sb0}}; |
| mcause_q <= {6 {1'sb0}}; |
| mtval_q <= {32 {1'sb0}}; |
| mtvec_q <= 32'h00000001; |
| dcsr_q <= {sv2v_cast_4(XDEBUGVER_STD), 12'b000000000000, 1'sb0, 1'sb0, 1'sb0, 1'sb0, 1'sb0, 1'sb0, 1'sb0, sv2v_cast_3(DBG_CAUSE_NONE), 1'sb0, 1'sb0, 1'sb0, 1'sb0, sv2v_cast_2(PRIV_LVL_M)}; |
| depc_q <= {32 {1'sb0}}; |
| dscratch0_q <= {32 {1'sb0}}; |
| dscratch1_q <= {32 {1'sb0}}; |
| mstack_q <= {1'b1, sv2v_cast_2(PRIV_LVL_U)}; |
| mstack_epc_q <= {32 {1'sb0}}; |
| mstack_cause_q <= {6 {1'sb0}}; |
| end |
| else begin |
| priv_lvl_q <= priv_lvl_d; |
| mstatus_q <= mstatus_d; |
| mie_q <= mie_d; |
| mscratch_q <= mscratch_d; |
| mepc_q <= mepc_d; |
| mcause_q <= mcause_d; |
| mtval_q <= mtval_d; |
| mtvec_q <= mtvec_d; |
| dcsr_q <= dcsr_d; |
| depc_q <= depc_d; |
| dscratch0_q <= dscratch0_d; |
| dscratch1_q <= dscratch1_d; |
| mstack_q <= mstack_d; |
| mstack_epc_q <= mstack_epc_d; |
| mstack_cause_q <= mstack_cause_d; |
| end |
| assign priv_mode_id_o = priv_lvl_q; |
| assign priv_mode_if_o = priv_lvl_d; |
| assign priv_mode_lsu_o = (mstatus_q[1] ? mstatus_q[3-:2] : priv_lvl_q); |
| generate |
| if (PMPEnable) begin : g_pmp_registers |
| reg [5:0] pmp_cfg [0:PMPNumRegions - 1]; |
| reg [5:0] pmp_cfg_wdata [0:PMPNumRegions - 1]; |
| reg [31:0] pmp_addr [0:PMPNumRegions - 1]; |
| wire [PMPNumRegions - 1:0] pmp_cfg_we; |
| wire [PMPNumRegions - 1:0] pmp_addr_we; |
| genvar i; |
| for (i = 0; i < PMP_MAX_REGIONS; i = i + 1) begin : g_exp_rd_data |
| if (i < PMPNumRegions) begin : g_implemented_regions |
| assign pmp_cfg_rdata[i] = {pmp_cfg[i][5], 2'b00, pmp_cfg[i][4-:2], pmp_cfg[i][2], pmp_cfg[i][1], pmp_cfg[i][0]}; |
| if (PMPGranularity == 0) begin : g_pmp_g0 |
| always @(*) pmp_addr_rdata[i] = pmp_addr[i]; |
| end |
| else if (PMPGranularity == 1) begin : g_pmp_g1 |
| always @(*) begin |
| pmp_addr_rdata[i] = pmp_addr[i]; |
| if ((pmp_cfg[i][4-:2] == PMP_MODE_OFF) || (pmp_cfg[i][4-:2] == PMP_MODE_TOR)) |
| pmp_addr_rdata[i][PMPGranularity - 1:0] = {PMPGranularity {1'sb0}}; |
| end |
| end |
| else begin : g_pmp_g2 |
| always @(*) begin |
| pmp_addr_rdata[i] = pmp_addr[i]; |
| if ((pmp_cfg[i][4-:2] == PMP_MODE_OFF) || (pmp_cfg[i][4-:2] == PMP_MODE_TOR)) |
| pmp_addr_rdata[i][PMPGranularity - 1:0] = {PMPGranularity {1'sb0}}; |
| else if (pmp_cfg[i][4-:2] == PMP_MODE_NAPOT) |
| pmp_addr_rdata[i][PMPGranularity - 2:0] = {((PMPGranularity - 2) >= 0 ? PMPGranularity - 1 : 3 - PMPGranularity) {1'sb1}}; |
| end |
| end |
| end |
| else begin : g_other_regions |
| assign pmp_cfg_rdata[i] = {PMP_CFG_W {1'sb0}}; |
| always @(*) pmp_addr_rdata[i] = {32 {1'sb0}}; |
| end |
| end |
| for (i = 0; i < PMPNumRegions; i = i + 1) begin : g_pmp_csrs |
| assign pmp_cfg_we[i] = (csr_we_int & ~pmp_cfg[i][5]) & (csr_addr == (CSR_OFF_PMP_CFG + (i[11:0] >> 2))); |
| always @(*) pmp_cfg_wdata[i][5] = csr_wdata_int[((i % 4) * PMP_CFG_W) + 7]; |
| always @(*) |
| case (csr_wdata_int[((i % 4) * PMP_CFG_W) + 3+:2]) |
| 2'b00: pmp_cfg_wdata[i][4-:2] = PMP_MODE_OFF; |
| 2'b01: pmp_cfg_wdata[i][4-:2] = PMP_MODE_TOR; |
| 2'b10: pmp_cfg_wdata[i][4-:2] = (PMPGranularity == 0 ? PMP_MODE_NA4 : PMP_MODE_OFF); |
| 2'b11: pmp_cfg_wdata[i][4-:2] = PMP_MODE_NAPOT; |
| default: pmp_cfg_wdata[i][4-:2] = PMP_MODE_OFF; |
| endcase |
| always @(*) pmp_cfg_wdata[i][2] = csr_wdata_int[((i % 4) * PMP_CFG_W) + 2]; |
| always @(*) pmp_cfg_wdata[i][1] = &csr_wdata_int[(i % 4) * PMP_CFG_W+:2]; |
| always @(*) pmp_cfg_wdata[i][0] = csr_wdata_int[(i % 4) * PMP_CFG_W]; |
| function automatic [5:0] sv2v_cast_6; |
| input reg [5:0] inp; |
| sv2v_cast_6 = inp; |
| endfunction |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| pmp_cfg[i] <= sv2v_cast_6('b0); |
| else if (pmp_cfg_we[i]) |
| pmp_cfg[i] <= pmp_cfg_wdata[i]; |
| if (i < (PMPNumRegions - 1)) begin : g_lower |
| assign pmp_addr_we[i] = ((csr_we_int & ~pmp_cfg[i][5]) & (~pmp_cfg[i + 1][5] | (pmp_cfg[i + 1][4-:2] != PMP_MODE_TOR))) & (csr_addr == (CSR_OFF_PMP_ADDR + i[11:0])); |
| end |
| else begin : g_upper |
| assign pmp_addr_we[i] = (csr_we_int & ~pmp_cfg[i][5]) & (csr_addr == (CSR_OFF_PMP_ADDR + i[11:0])); |
| end |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| pmp_addr[i] <= 'b0; |
| else if (pmp_addr_we[i]) |
| pmp_addr[i] <= csr_wdata_int; |
| assign csr_pmp_cfg_o[(0 >= (PMPNumRegions - 1) ? i : (PMPNumRegions - 1) - i) * 6+:6] = pmp_cfg[i]; |
| assign csr_pmp_addr_o[(0 >= (PMPNumRegions - 1) ? i : (PMPNumRegions - 1) - i) * 34+:34] = {pmp_addr[i], 2'b00}; |
| end |
| end |
| else begin : g_no_pmp_tieoffs |
| genvar i; |
| for (i = 0; i < PMP_MAX_REGIONS; i = i + 1) begin : g_rdata |
| always @(*) pmp_addr_rdata[i] = {32 {1'sb0}}; |
| assign pmp_cfg_rdata[i] = {PMP_CFG_W {1'sb0}}; |
| end |
| for (i = 0; i < PMPNumRegions; i = i + 1) begin : g_outputs |
| function automatic [5:0] sv2v_cast_6; |
| input reg [5:0] inp; |
| sv2v_cast_6 = inp; |
| endfunction |
| assign csr_pmp_cfg_o[(0 >= (PMPNumRegions - 1) ? i : (PMPNumRegions - 1) - i) * 6+:6] = sv2v_cast_6(1'b0); |
| assign csr_pmp_addr_o[(0 >= (PMPNumRegions - 1) ? i : (PMPNumRegions - 1) - i) * 34+:34] = {34 {1'sb0}}; |
| end |
| end |
| endgenerate |
| always @(*) begin : mcountinhibit_update |
| if (mcountinhibit_we == 1'b1) |
| mcountinhibit_d = {csr_wdata_int[MHPMCounterNum + 2:2], 1'b0, csr_wdata_int[0]}; |
| else |
| mcountinhibit_d = mcountinhibit_q; |
| end |
| always @(*) begin : gen_mhpmcounter_incr |
| begin : sv2v_autoblock_53 |
| reg [31:0] i; |
| for (i = 0; i < 32; i = i + 1) |
| begin : gen_mhpmcounter_incr_inactive |
| mhpmcounter_incr[i] = 1'b0; |
| end |
| end |
| mhpmcounter_incr[0] = 1'b1; |
| mhpmcounter_incr[1] = 1'b0; |
| mhpmcounter_incr[2] = instr_ret_i; |
| mhpmcounter_incr[3] = dside_wait_i; |
| mhpmcounter_incr[4] = iside_wait_i; |
| mhpmcounter_incr[5] = mem_load_i; |
| mhpmcounter_incr[6] = mem_store_i; |
| mhpmcounter_incr[7] = jump_i; |
| mhpmcounter_incr[8] = branch_i; |
| mhpmcounter_incr[9] = branch_taken_i; |
| mhpmcounter_incr[10] = instr_ret_compressed_i; |
| mhpmcounter_incr[11] = mul_wait_i; |
| mhpmcounter_incr[12] = div_wait_i; |
| end |
| always @(*) begin : gen_mhpmevent |
| begin : sv2v_autoblock_54 |
| reg signed [31:0] i; |
| for (i = 0; i < 32; i = i + 1) |
| begin : gen_mhpmevent_active |
| mhpmevent[i] = {32 {1'sb0}}; |
| mhpmevent[i][i] = 1'b1; |
| end |
| end |
| mhpmevent[1] = {32 {1'sb0}}; |
| begin : sv2v_autoblock_55 |
| reg [31:0] i; |
| for (i = 3 + MHPMCounterNum; i < 32; i = i + 1) |
| begin : gen_mhpmevent_inactive |
| mhpmevent[i] = {32 {1'sb0}}; |
| end |
| end |
| end |
| brqrv_csr_mcounter #(.CounterWidth(64)) mcycle_counter_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .counter_inc_i(mhpmcounter_incr[0] & ~mcountinhibit[0]), |
| .counterh_we_i(mhpmcounterh_we[0]), |
| .counter_we_i(mhpmcounter_we[0]), |
| .counter_val_i(csr_wdata_int), |
| .counter_val_o(mhpmcounter[0]) |
| ); |
| brqrv_csr_mcounter #(.CounterWidth(64)) minstret_counter_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .counter_inc_i(mhpmcounter_incr[2] & ~mcountinhibit[2]), |
| .counterh_we_i(mhpmcounterh_we[2]), |
| .counter_we_i(mhpmcounter_we[2]), |
| .counter_val_i(csr_wdata_int), |
| .counter_val_o(mhpmcounter[2]) |
| ); |
| assign mhpmcounter[1] = {64 {1'sb0}}; |
| generate |
| genvar cnt; |
| for (cnt = 0; cnt < MHPMCounterNum; cnt = cnt + 1) begin : gen_cntrs |
| brqrv_csr_mcounter #(.CounterWidth(MHPMCounterWidth)) mcounters_variable_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .counter_inc_i(mhpmcounter_incr[cnt + 3] & ~mcountinhibit[cnt + 3]), |
| .counterh_we_i(mhpmcounterh_we[cnt + 3]), |
| .counter_we_i(mhpmcounter_we[cnt + 3]), |
| .counter_val_i(csr_wdata_int), |
| .counter_val_o(mhpmcounter[cnt + 3]) |
| ); |
| end |
| endgenerate |
| generate |
| if (MHPMCounterNum < 29) begin : g_mcountinhibit_reduced |
| wire [(29 - MHPMCounterNum) - 1:0] unused_mhphcounter_we; |
| wire [(29 - MHPMCounterNum) - 1:0] unused_mhphcounterh_we; |
| wire [(29 - MHPMCounterNum) - 1:0] unused_mhphcounter_incr; |
| assign mcountinhibit = {{29 - MHPMCounterNum {1'b1}}, mcountinhibit_q}; |
| assign unused_mhphcounter_we = mhpmcounter_we[31:MHPMCounterNum + 3]; |
| assign unused_mhphcounterh_we = mhpmcounterh_we[31:MHPMCounterNum + 3]; |
| assign unused_mhphcounter_incr = mhpmcounter_incr[31:MHPMCounterNum + 3]; |
| end |
| else begin : g_mcountinhibit_full |
| assign mcountinhibit = mcountinhibit_q; |
| end |
| endgenerate |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| mcountinhibit_q <= {((MHPMCounterNum + 2) >= 0 ? MHPMCounterNum + 3 : 1 - (MHPMCounterNum + 2)) {1'sb0}}; |
| else |
| mcountinhibit_q <= mcountinhibit_d; |
| generate |
| if (DbgTriggerEn) begin : gen_trigger_regs |
| wire tmatch_control_d; |
| reg tmatch_control_q; |
| wire [31:0] tmatch_value_d; |
| reg [31:0] tmatch_value_q; |
| wire tmatch_control_we; |
| wire tmatch_value_we; |
| assign tmatch_control_we = (csr_we_int & debug_mode_i) & (csr_addr_i == CSR_TDATA1); |
| assign tmatch_value_we = (csr_we_int & debug_mode_i) & (csr_addr_i == CSR_TDATA2); |
| assign tmatch_control_d = (tmatch_control_we ? csr_wdata_int[2] : tmatch_control_q); |
| assign tmatch_value_d = csr_wdata_int[31:0]; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| tmatch_control_q <= 'b0; |
| else |
| tmatch_control_q <= tmatch_control_d; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| tmatch_value_q <= 'b0; |
| else if (tmatch_value_we) |
| tmatch_value_q <= tmatch_value_d; |
| assign tselect_rdata = 'b0; |
| assign tmatch_control_rdata = {4'h2, 1'b1, 6'h00, 1'b0, 1'b0, 1'b0, 2'b00, 4'h1, 1'b0, 4'h0, 1'b1, 1'b0, 1'b0, 1'b1, tmatch_control_q, 1'b0, 1'b0}; |
| assign tmatch_value_rdata = tmatch_value_q; |
| assign trigger_match_o = tmatch_control_q & (pc_if_i[31:0] == tmatch_value_q[31:0]); |
| end |
| else begin : gen_no_trigger_regs |
| assign tselect_rdata = 'b0; |
| assign tmatch_control_rdata = 'b0; |
| assign tmatch_value_rdata = 'b0; |
| assign trigger_match_o = 'b0; |
| end |
| endgenerate |
| assign cpuctrl_rdata[31-:26] = {26 {1'sb0}}; |
| assign cpuctrl_wdata = sv2v_cast_32(csr_wdata_int); |
| generate |
| if (DataIndTiming) begin : gen_dit |
| wire data_ind_timing_d; |
| reg data_ind_timing_q; |
| assign data_ind_timing_d = (csr_we_int && (csr_addr == CSR_CPUCTRL) ? cpuctrl_wdata[1] : data_ind_timing_q); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| data_ind_timing_q <= 1'b0; |
| else |
| data_ind_timing_q <= data_ind_timing_d; |
| assign cpuctrl_rdata[1] = data_ind_timing_q; |
| end |
| else begin : gen_no_dit |
| wire unused_dit; |
| assign unused_dit = cpuctrl_wdata[1]; |
| assign cpuctrl_rdata[1] = 1'b0; |
| end |
| endgenerate |
| assign data_ind_timing_o = cpuctrl_rdata[1]; |
| generate |
| if (DummyInstructions) begin : gen_dummy |
| wire dummy_instr_en_d; |
| reg dummy_instr_en_q; |
| wire [2:0] dummy_instr_mask_d; |
| reg [2:0] dummy_instr_mask_q; |
| assign dummy_instr_en_d = (csr_we_int && (csr_addr == CSR_CPUCTRL) ? cpuctrl_wdata[2] : dummy_instr_en_q); |
| assign dummy_instr_mask_d = (csr_we_int && (csr_addr == CSR_CPUCTRL) ? cpuctrl_wdata[5-:3] : dummy_instr_mask_q); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| dummy_instr_en_q <= 1'b0; |
| dummy_instr_mask_q <= 3'b000; |
| end |
| else begin |
| dummy_instr_en_q <= dummy_instr_en_d; |
| dummy_instr_mask_q <= dummy_instr_mask_d; |
| end |
| assign cpuctrl_rdata[2] = dummy_instr_en_q; |
| assign cpuctrl_rdata[5-:3] = dummy_instr_mask_q; |
| assign dummy_instr_seed_en_o = csr_we_int && (csr_addr == CSR_SECURESEED); |
| assign dummy_instr_seed_o = csr_wdata_int; |
| end |
| else begin : gen_no_dummy |
| wire unused_dummy_en; |
| wire [2:0] unused_dummy_mask; |
| assign unused_dummy_en = cpuctrl_wdata[2]; |
| assign unused_dummy_mask = cpuctrl_wdata[5-:3]; |
| assign cpuctrl_rdata[2] = 1'b0; |
| assign cpuctrl_rdata[5-:3] = 3'b000; |
| assign dummy_instr_seed_en_o = 1'b0; |
| assign dummy_instr_seed_o = {32 {1'sb0}}; |
| end |
| endgenerate |
| assign dummy_instr_en_o = cpuctrl_rdata[2]; |
| assign dummy_instr_mask_o = cpuctrl_rdata[5-:3]; |
| generate |
| if (ICache) begin : gen_icache_enable |
| wire icache_enable_d; |
| reg icache_enable_q; |
| assign icache_enable_d = (csr_we_int & (csr_addr == CSR_CPUCTRL) ? cpuctrl_wdata[0] : icache_enable_q); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| icache_enable_q <= 1'b0; |
| else |
| icache_enable_q <= icache_enable_d; |
| assign cpuctrl_rdata[0] = icache_enable_q; |
| end |
| else begin : gen_no_icache |
| wire unused_icen; |
| assign unused_icen = cpuctrl_wdata[0]; |
| assign cpuctrl_rdata[0] = 1'b0; |
| end |
| endgenerate |
| assign icache_enable_o = cpuctrl_rdata[0]; |
| wire [31:6] unused_cpuctrl; |
| assign unused_cpuctrl = cpuctrl_wdata[31:6]; |
| endmodule |
| module brqrv_csr_mcounter ( |
| clk_i, |
| rst_ni, |
| counter_inc_i, |
| counterh_we_i, |
| counter_we_i, |
| counter_val_i, |
| counter_val_o |
| ); |
| parameter signed [31:0] CounterWidth = 32; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire counter_inc_i; |
| input wire counterh_we_i; |
| input wire counter_we_i; |
| input wire [31:0] counter_val_i; |
| output wire [63:0] counter_val_o; |
| wire [63:0] counter; |
| reg [CounterWidth - 1:0] counter_upd; |
| reg [63:0] counter_load; |
| reg we; |
| reg [CounterWidth - 1:0] counter_d; |
| always @(*) begin |
| we = counter_we_i | counterh_we_i; |
| counter_load[63:32] = counter[63:32]; |
| counter_load[31:0] = counter_val_i; |
| if (counterh_we_i) begin |
| counter_load[63:32] = counter_val_i; |
| counter_load[31:0] = counter[31:0]; |
| end |
| counter_upd = counter[CounterWidth - 1:0] + {{CounterWidth - 1 {1'b0}}, 1'b1}; |
| if (we) |
| counter_d = counter_load[CounterWidth - 1:0]; |
| else if (counter_inc_i) |
| counter_d = counter_upd[CounterWidth - 1:0]; |
| else |
| counter_d = counter[CounterWidth - 1:0]; |
| end |
| reg [CounterWidth - 1:0] counter_q; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| counter_q <= {CounterWidth {1'sb0}}; |
| else |
| counter_q <= counter_d; |
| generate |
| if (CounterWidth < 64) begin : g_counter_narrow |
| wire [63:CounterWidth] unused_counter_load; |
| assign counter[CounterWidth - 1:0] = counter_q; |
| assign counter[63:CounterWidth] = {(63 >= CounterWidth ? 64 - CounterWidth : CounterWidth - 62) {1'sb0}}; |
| assign unused_counter_load = counter_load[63:CounterWidth]; |
| end |
| else begin : g_counter_full |
| assign counter = counter_q; |
| end |
| endgenerate |
| assign counter_val_o = counter; |
| endmodule |
| module brqrv_exu ( |
| clk_i, |
| rst_ni, |
| alu_operator_i, |
| alu_operand_a_i, |
| alu_operand_b_i, |
| alu_instr_first_cycle_i, |
| bt_a_operand_i, |
| bt_b_operand_i, |
| multdiv_operator_i, |
| mult_en_i, |
| div_en_i, |
| mult_sel_i, |
| div_sel_i, |
| multdiv_signed_mode_i, |
| multdiv_operand_a_i, |
| multdiv_operand_b_i, |
| multdiv_ready_id_i, |
| data_ind_timing_i, |
| imd_val_we_o, |
| imd_val_d_o, |
| imd_val_q_i, |
| alu_adder_result_ex_o, |
| result_ex_o, |
| branch_target_o, |
| branch_decision_o, |
| ex_valid_o |
| ); |
| localparam integer brqrv_pkg_RV32MFast = 2; |
| parameter integer RV32M = brqrv_pkg_RV32MFast; |
| localparam integer brqrv_pkg_RV32BNone = 0; |
| parameter integer RV32B = brqrv_pkg_RV32BNone; |
| parameter [0:0] BranchTargetALU = 0; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire [5:0] alu_operator_i; |
| input wire [31:0] alu_operand_a_i; |
| input wire [31:0] alu_operand_b_i; |
| input wire alu_instr_first_cycle_i; |
| input wire [31:0] bt_a_operand_i; |
| input wire [31:0] bt_b_operand_i; |
| input wire [1:0] multdiv_operator_i; |
| input wire mult_en_i; |
| input wire div_en_i; |
| input wire mult_sel_i; |
| input wire div_sel_i; |
| input wire [1:0] multdiv_signed_mode_i; |
| input wire [31:0] multdiv_operand_a_i; |
| input wire [31:0] multdiv_operand_b_i; |
| input wire multdiv_ready_id_i; |
| input wire data_ind_timing_i; |
| output wire [1:0] imd_val_we_o; |
| output wire [67:0] imd_val_d_o; |
| input wire [67:0] imd_val_q_i; |
| output wire [31:0] alu_adder_result_ex_o; |
| output wire [31:0] result_ex_o; |
| output wire [31:0] branch_target_o; |
| output wire branch_decision_o; |
| output wire ex_valid_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| wire [31:0] alu_result; |
| wire [31:0] multdiv_result; |
| wire [32:0] multdiv_alu_operand_b; |
| wire [32:0] multdiv_alu_operand_a; |
| wire [33:0] alu_adder_result_ext; |
| wire alu_cmp_result; |
| wire alu_is_equal_result; |
| wire multdiv_valid; |
| wire multdiv_sel; |
| wire [63:0] alu_imd_val_q; |
| wire [63:0] alu_imd_val_d; |
| wire [1:0] alu_imd_val_we; |
| wire [67:0] multdiv_imd_val_d; |
| wire [1:0] multdiv_imd_val_we; |
| generate |
| if (RV32M != RV32MNone) begin : gen_multdiv_m |
| assign multdiv_sel = mult_sel_i | div_sel_i; |
| end |
| else begin : gen_multdiv_no_m |
| assign multdiv_sel = 1'b0; |
| end |
| endgenerate |
| assign imd_val_d_o[34+:34] = (multdiv_sel ? multdiv_imd_val_d[34+:34] : {2'b00, alu_imd_val_d[32+:32]}); |
| assign imd_val_d_o[0+:34] = (multdiv_sel ? multdiv_imd_val_d[0+:34] : {2'b00, alu_imd_val_d[0+:32]}); |
| assign imd_val_we_o = (multdiv_sel ? multdiv_imd_val_we : alu_imd_val_we); |
| assign alu_imd_val_q = {imd_val_q_i[65-:32], imd_val_q_i[31-:32]}; |
| assign result_ex_o = (multdiv_sel ? multdiv_result : alu_result); |
| assign branch_decision_o = alu_cmp_result; |
| generate |
| if (BranchTargetALU) begin : g_branch_target_alu |
| wire [32:0] bt_alu_result; |
| wire unused_bt_carry; |
| assign bt_alu_result = bt_a_operand_i + bt_b_operand_i; |
| assign unused_bt_carry = bt_alu_result[32]; |
| assign branch_target_o = bt_alu_result[31:0]; |
| end |
| else begin : g_no_branch_target_alu |
| wire [31:0] unused_bt_a_operand; |
| wire [31:0] unused_bt_b_operand; |
| assign unused_bt_a_operand = bt_a_operand_i; |
| assign unused_bt_b_operand = bt_b_operand_i; |
| assign branch_target_o = alu_adder_result_ex_o; |
| end |
| endgenerate |
| brqrv_exu_alu #(.RV32B(RV32B)) alu_i( |
| .operator_i(alu_operator_i), |
| .operand_a_i(alu_operand_a_i), |
| .operand_b_i(alu_operand_b_i), |
| .instr_first_cycle_i(alu_instr_first_cycle_i), |
| .imd_val_q_i(alu_imd_val_q), |
| .imd_val_we_o(alu_imd_val_we), |
| .imd_val_d_o(alu_imd_val_d), |
| .multdiv_operand_a_i(multdiv_alu_operand_a), |
| .multdiv_operand_b_i(multdiv_alu_operand_b), |
| .multdiv_sel_i(multdiv_sel), |
| .adder_result_o(alu_adder_result_ex_o), |
| .adder_result_ext_o(alu_adder_result_ext), |
| .result_o(alu_result), |
| .comparison_result_o(alu_cmp_result), |
| .is_equal_result_o(alu_is_equal_result) |
| ); |
| generate |
| if (RV32M == RV32MSlow) begin : gen_multdiv_slow |
| brqrv_exu_multdiv_slow multdiv_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .mult_en_i(mult_en_i), |
| .div_en_i(div_en_i), |
| .mult_sel_i(mult_sel_i), |
| .div_sel_i(div_sel_i), |
| .operator_i(multdiv_operator_i), |
| .signed_mode_i(multdiv_signed_mode_i), |
| .op_a_i(multdiv_operand_a_i), |
| .op_b_i(multdiv_operand_b_i), |
| .alu_adder_ext_i(alu_adder_result_ext), |
| .alu_adder_i(alu_adder_result_ex_o), |
| .equal_to_zero_i(alu_is_equal_result), |
| .data_ind_timing_i(data_ind_timing_i), |
| .valid_o(multdiv_valid), |
| .alu_operand_a_o(multdiv_alu_operand_a), |
| .alu_operand_b_o(multdiv_alu_operand_b), |
| .imd_val_q_i(imd_val_q_i), |
| .imd_val_d_o(multdiv_imd_val_d), |
| .imd_val_we_o(multdiv_imd_val_we), |
| .multdiv_ready_id_i(multdiv_ready_id_i), |
| .multdiv_result_o(multdiv_result) |
| ); |
| end |
| else if ((RV32M == RV32MFast) || (RV32M == RV32MSingleCycle)) begin : gen_multdiv_fast |
| brqrv_exu_multdiv_fast #(.RV32M(RV32M)) multdiv_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .mult_en_i(mult_en_i), |
| .div_en_i(div_en_i), |
| .mult_sel_i(mult_sel_i), |
| .div_sel_i(div_sel_i), |
| .operator_i(multdiv_operator_i), |
| .signed_mode_i(multdiv_signed_mode_i), |
| .op_a_i(multdiv_operand_a_i), |
| .op_b_i(multdiv_operand_b_i), |
| .alu_operand_a_o(multdiv_alu_operand_a), |
| .alu_operand_b_o(multdiv_alu_operand_b), |
| .alu_adder_ext_i(alu_adder_result_ext), |
| .alu_adder_i(alu_adder_result_ex_o), |
| .equal_to_zero_i(alu_is_equal_result), |
| .data_ind_timing_i(data_ind_timing_i), |
| .imd_val_q_i(imd_val_q_i), |
| .imd_val_d_o(multdiv_imd_val_d), |
| .imd_val_we_o(multdiv_imd_val_we), |
| .multdiv_ready_id_i(multdiv_ready_id_i), |
| .valid_o(multdiv_valid), |
| .multdiv_result_o(multdiv_result) |
| ); |
| end |
| endgenerate |
| assign ex_valid_o = (multdiv_sel ? multdiv_valid : ~(|alu_imd_val_we)); |
| endmodule |
| module brqrv_exu_alu ( |
| operator_i, |
| operand_a_i, |
| operand_b_i, |
| instr_first_cycle_i, |
| multdiv_operand_a_i, |
| multdiv_operand_b_i, |
| multdiv_sel_i, |
| imd_val_q_i, |
| imd_val_d_o, |
| imd_val_we_o, |
| adder_result_o, |
| adder_result_ext_o, |
| result_o, |
| comparison_result_o, |
| is_equal_result_o |
| ); |
| localparam integer brqrv_pkg_RV32BNone = 0; |
| parameter integer RV32B = brqrv_pkg_RV32BNone; |
| input wire [5:0] operator_i; |
| input wire [31:0] operand_a_i; |
| input wire [31:0] operand_b_i; |
| input wire instr_first_cycle_i; |
| input wire [32:0] multdiv_operand_a_i; |
| input wire [32:0] multdiv_operand_b_i; |
| input wire multdiv_sel_i; |
| input wire [63:0] imd_val_q_i; |
| output reg [63:0] imd_val_d_o; |
| output reg [1:0] imd_val_we_o; |
| output wire [31:0] adder_result_o; |
| output wire [33:0] adder_result_ext_o; |
| output reg [31:0] result_o; |
| output wire comparison_result_o; |
| output wire is_equal_result_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| wire [31:0] operand_a_rev; |
| wire [32:0] operand_b_neg; |
| generate |
| genvar k; |
| for (k = 0; k < 32; k = k + 1) begin : gen_rev_operand_a |
| assign operand_a_rev[k] = operand_a_i[31 - k]; |
| end |
| endgenerate |
| reg adder_op_b_negate; |
| wire [32:0] adder_in_a; |
| reg [32:0] adder_in_b; |
| wire [31:0] adder_result; |
| always @(*) begin |
| adder_op_b_negate = 1'b0; |
| case (operator_i) |
| ALU_SUB, ALU_EQ, ALU_NE, ALU_GE, ALU_GEU, ALU_LT, ALU_LTU, ALU_SLT, ALU_SLTU, ALU_MIN, ALU_MINU, ALU_MAX, ALU_MAXU: adder_op_b_negate = 1'b1; |
| default: |
| ; |
| endcase |
| end |
| assign adder_in_a = (multdiv_sel_i ? multdiv_operand_a_i : {operand_a_i, 1'b1}); |
| assign operand_b_neg = {operand_b_i, 1'b0} ^ {33 {1'b1}}; |
| always @(*) |
| case (1'b1) |
| multdiv_sel_i: adder_in_b = multdiv_operand_b_i; |
| adder_op_b_negate: adder_in_b = operand_b_neg; |
| default: adder_in_b = {operand_b_i, 1'b0}; |
| endcase |
| assign adder_result_ext_o = $unsigned(adder_in_a) + $unsigned(adder_in_b); |
| assign adder_result = adder_result_ext_o[32:1]; |
| assign adder_result_o = adder_result; |
| wire is_equal; |
| reg is_greater_equal; |
| reg cmp_signed; |
| always @(*) |
| case (operator_i) |
| ALU_GE, ALU_LT, ALU_SLT, ALU_MIN, ALU_MAX: cmp_signed = 1'b1; |
| default: cmp_signed = 1'b0; |
| endcase |
| assign is_equal = adder_result == 32'b00000000000000000000000000000000; |
| assign is_equal_result_o = is_equal; |
| always @(*) |
| if ((operand_a_i[31] ^ operand_b_i[31]) == 1'b0) |
| is_greater_equal = adder_result[31] == 1'b0; |
| else |
| is_greater_equal = operand_a_i[31] ^ cmp_signed; |
| reg cmp_result; |
| always @(*) |
| case (operator_i) |
| ALU_EQ: cmp_result = is_equal; |
| ALU_NE: cmp_result = ~is_equal; |
| ALU_GE, ALU_GEU, ALU_MAX, ALU_MAXU: cmp_result = is_greater_equal; |
| ALU_LT, ALU_LTU, ALU_MIN, ALU_MINU, ALU_SLT, ALU_SLTU: cmp_result = ~is_greater_equal; |
| default: cmp_result = is_equal; |
| endcase |
| assign comparison_result_o = cmp_result; |
| reg shift_left; |
| wire shift_ones; |
| wire shift_arith; |
| wire shift_funnel; |
| wire shift_sbmode; |
| reg [5:0] shift_amt; |
| wire [5:0] shift_amt_compl; |
| reg [31:0] shift_result; |
| reg [32:0] shift_result_ext; |
| reg [31:0] shift_result_rev; |
| wire bfp_op; |
| wire [4:0] bfp_len; |
| wire [4:0] bfp_off; |
| wire [31:0] bfp_mask; |
| wire [31:0] bfp_mask_rev; |
| wire [31:0] bfp_result; |
| assign bfp_op = (RV32B != RV32BNone ? operator_i == ALU_BFP : 1'b0); |
| assign bfp_len = {~(|operand_b_i[27:24]), operand_b_i[27:24]}; |
| assign bfp_off = operand_b_i[20:16]; |
| assign bfp_mask = (RV32B != RV32BNone ? ~(32'hffffffff << bfp_len) : {32 {1'sb0}}); |
| generate |
| genvar i; |
| for (i = 0; i < 32; i = i + 1) begin : gen_rev_bfp_mask |
| assign bfp_mask_rev[i] = bfp_mask[31 - i]; |
| end |
| endgenerate |
| assign bfp_result = (RV32B != RV32BNone ? (~shift_result & operand_a_i) | ((operand_b_i & bfp_mask) << bfp_off) : {32 {1'sb0}}); |
| always @(*) shift_amt[5] = operand_b_i[5] & shift_funnel; |
| assign shift_amt_compl = 32 - operand_b_i[4:0]; |
| always @(*) |
| if (bfp_op) |
| shift_amt[4:0] = bfp_off; |
| else |
| shift_amt[4:0] = (instr_first_cycle_i ? (operand_b_i[5] && shift_funnel ? shift_amt_compl[4:0] : operand_b_i[4:0]) : (operand_b_i[5] && shift_funnel ? operand_b_i[4:0] : shift_amt_compl[4:0])); |
| assign shift_sbmode = (RV32B != RV32BNone ? ((operator_i == ALU_SBSET) | (operator_i == ALU_SBCLR)) | (operator_i == ALU_SBINV) : 1'b0); |
| always @(*) begin |
| case (operator_i) |
| ALU_SLL: shift_left = 1'b1; |
| ALU_SLO, ALU_BFP: shift_left = (RV32B != RV32BNone ? 1'b1 : 1'b0); |
| ALU_ROL: shift_left = (RV32B != RV32BNone ? instr_first_cycle_i : 0); |
| ALU_ROR: shift_left = (RV32B != RV32BNone ? ~instr_first_cycle_i : 0); |
| ALU_FSL: shift_left = (RV32B != RV32BNone ? (shift_amt[5] ? ~instr_first_cycle_i : instr_first_cycle_i) : 1'b0); |
| ALU_FSR: shift_left = (RV32B != RV32BNone ? (shift_amt[5] ? instr_first_cycle_i : ~instr_first_cycle_i) : 1'b0); |
| default: shift_left = 1'b0; |
| endcase |
| if (shift_sbmode) |
| shift_left = 1'b1; |
| end |
| assign shift_arith = operator_i == ALU_SRA; |
| assign shift_ones = (RV32B != RV32BNone ? (operator_i == ALU_SLO) | (operator_i == ALU_SRO) : 1'b0); |
| assign shift_funnel = (RV32B != RV32BNone ? (operator_i == ALU_FSL) | (operator_i == ALU_FSR) : 1'b0); |
| always @(*) begin |
| if (RV32B == RV32BNone) |
| shift_result = (shift_left ? operand_a_rev : operand_a_i); |
| else |
| case (1'b1) |
| bfp_op: shift_result = bfp_mask_rev; |
| shift_sbmode: shift_result = 32'h80000000; |
| default: shift_result = (shift_left ? operand_a_rev : operand_a_i); |
| endcase |
| shift_result_ext = $signed({shift_ones | (shift_arith & shift_result[31]), shift_result}) >>> shift_amt[4:0]; |
| shift_result = shift_result_ext[31:0]; |
| begin : sv2v_autoblock_56 |
| reg [31:0] i; |
| for (i = 0; i < 32; i = i + 1) |
| shift_result_rev[i] = shift_result[31 - i]; |
| end |
| shift_result = (shift_left ? shift_result_rev : shift_result); |
| end |
| wire bwlogic_or; |
| wire bwlogic_and; |
| wire [31:0] bwlogic_operand_b; |
| wire [31:0] bwlogic_or_result; |
| wire [31:0] bwlogic_and_result; |
| wire [31:0] bwlogic_xor_result; |
| reg [31:0] bwlogic_result; |
| reg bwlogic_op_b_negate; |
| always @(*) |
| case (operator_i) |
| ALU_XNOR, ALU_ORN, ALU_ANDN: bwlogic_op_b_negate = (RV32B != RV32BNone ? 1'b1 : 1'b0); |
| ALU_CMIX: bwlogic_op_b_negate = (RV32B != RV32BNone ? ~instr_first_cycle_i : 1'b0); |
| default: bwlogic_op_b_negate = 1'b0; |
| endcase |
| assign bwlogic_operand_b = (bwlogic_op_b_negate ? operand_b_neg[32:1] : operand_b_i); |
| assign bwlogic_or_result = operand_a_i | bwlogic_operand_b; |
| assign bwlogic_and_result = operand_a_i & bwlogic_operand_b; |
| assign bwlogic_xor_result = operand_a_i ^ bwlogic_operand_b; |
| assign bwlogic_or = (operator_i == ALU_OR) | (operator_i == ALU_ORN); |
| assign bwlogic_and = (operator_i == ALU_AND) | (operator_i == ALU_ANDN); |
| always @(*) |
| case (1'b1) |
| bwlogic_or: bwlogic_result = bwlogic_or_result; |
| bwlogic_and: bwlogic_result = bwlogic_and_result; |
| default: bwlogic_result = bwlogic_xor_result; |
| endcase |
| wire [5:0] bitcnt_result; |
| wire [31:0] minmax_result; |
| reg [31:0] pack_result; |
| wire [31:0] sext_result; |
| reg [31:0] singlebit_result; |
| reg [31:0] rev_result; |
| reg [31:0] shuffle_result; |
| reg [31:0] butterfly_result; |
| reg [31:0] invbutterfly_result; |
| reg [31:0] clmul_result; |
| reg [31:0] multicycle_result; |
| generate |
| if (RV32B != RV32BNone) begin : g_alu_rvb |
| wire zbe_op; |
| wire bitcnt_ctz; |
| wire bitcnt_clz; |
| wire bitcnt_cz; |
| reg [31:0] bitcnt_bits; |
| wire [31:0] bitcnt_mask_op; |
| reg [31:0] bitcnt_bit_mask; |
| reg [191:0] bitcnt_partial; |
| wire [31:0] bitcnt_partial_lsb_d; |
| wire [31:0] bitcnt_partial_msb_d; |
| assign bitcnt_ctz = operator_i == ALU_CTZ; |
| assign bitcnt_clz = operator_i == ALU_CLZ; |
| assign bitcnt_cz = bitcnt_ctz | bitcnt_clz; |
| assign bitcnt_result = bitcnt_partial[0+:6]; |
| assign bitcnt_mask_op = (bitcnt_clz ? operand_a_rev : operand_a_i); |
| always @(*) begin |
| bitcnt_bit_mask = bitcnt_mask_op; |
| bitcnt_bit_mask = bitcnt_bit_mask | (bitcnt_bit_mask << 1); |
| bitcnt_bit_mask = bitcnt_bit_mask | (bitcnt_bit_mask << 2); |
| bitcnt_bit_mask = bitcnt_bit_mask | (bitcnt_bit_mask << 4); |
| bitcnt_bit_mask = bitcnt_bit_mask | (bitcnt_bit_mask << 8); |
| bitcnt_bit_mask = bitcnt_bit_mask | (bitcnt_bit_mask << 16); |
| bitcnt_bit_mask = ~bitcnt_bit_mask; |
| end |
| assign zbe_op = (operator_i == ALU_BEXT) | (operator_i == ALU_BDEP); |
| always @(*) |
| case (1'b1) |
| zbe_op: bitcnt_bits = operand_b_i; |
| bitcnt_cz: bitcnt_bits = bitcnt_bit_mask & ~bitcnt_mask_op; |
| default: bitcnt_bits = operand_a_i; |
| endcase |
| always @(*) begin |
| bitcnt_partial = {32 {6'b000000}}; |
| begin : sv2v_autoblock_57 |
| reg [31:0] i; |
| for (i = 1; i < 32; i = i + 2) |
| bitcnt_partial[(31 - i) * 6+:6] = {5'h00, bitcnt_bits[i]} + {5'h00, bitcnt_bits[i - 1]}; |
| end |
| begin : sv2v_autoblock_58 |
| reg [31:0] i; |
| for (i = 3; i < 32; i = i + 4) |
| bitcnt_partial[(31 - i) * 6+:6] = bitcnt_partial[(33 - i) * 6+:6] + bitcnt_partial[(31 - i) * 6+:6]; |
| end |
| begin : sv2v_autoblock_59 |
| reg [31:0] i; |
| for (i = 7; i < 32; i = i + 8) |
| bitcnt_partial[(31 - i) * 6+:6] = bitcnt_partial[(35 - i) * 6+:6] + bitcnt_partial[(31 - i) * 6+:6]; |
| end |
| begin : sv2v_autoblock_60 |
| reg [31:0] i; |
| for (i = 15; i < 32; i = i + 16) |
| bitcnt_partial[(31 - i) * 6+:6] = bitcnt_partial[(39 - i) * 6+:6] + bitcnt_partial[(31 - i) * 6+:6]; |
| end |
| bitcnt_partial[0+:6] = bitcnt_partial[96+:6] + bitcnt_partial[0+:6]; |
| bitcnt_partial[48+:6] = bitcnt_partial[96+:6] + bitcnt_partial[48+:6]; |
| begin : sv2v_autoblock_61 |
| reg [31:0] i; |
| for (i = 11; i < 32; i = i + 8) |
| bitcnt_partial[(31 - i) * 6+:6] = bitcnt_partial[(35 - i) * 6+:6] + bitcnt_partial[(31 - i) * 6+:6]; |
| end |
| begin : sv2v_autoblock_62 |
| reg [31:0] i; |
| for (i = 5; i < 32; i = i + 4) |
| bitcnt_partial[(31 - i) * 6+:6] = bitcnt_partial[(33 - i) * 6+:6] + bitcnt_partial[(31 - i) * 6+:6]; |
| end |
| bitcnt_partial[186+:6] = {5'h00, bitcnt_bits[0]}; |
| begin : sv2v_autoblock_63 |
| reg [31:0] i; |
| for (i = 2; i < 32; i = i + 2) |
| bitcnt_partial[(31 - i) * 6+:6] = bitcnt_partial[(32 - i) * 6+:6] + {5'h00, bitcnt_bits[i]}; |
| end |
| end |
| assign minmax_result = (cmp_result ? operand_a_i : operand_b_i); |
| wire packu; |
| wire packh; |
| assign packu = operator_i == ALU_PACKU; |
| assign packh = operator_i == ALU_PACKH; |
| always @(*) |
| case (1'b1) |
| packu: pack_result = {operand_b_i[31:16], operand_a_i[31:16]}; |
| packh: pack_result = {16'h0000, operand_b_i[7:0], operand_a_i[7:0]}; |
| default: pack_result = {operand_b_i[15:0], operand_a_i[15:0]}; |
| endcase |
| assign sext_result = (operator_i == ALU_SEXTB ? {{24 {operand_a_i[7]}}, operand_a_i[7:0]} : {{16 {operand_a_i[15]}}, operand_a_i[15:0]}); |
| always @(*) |
| case (operator_i) |
| ALU_SBSET: singlebit_result = operand_a_i | shift_result; |
| ALU_SBCLR: singlebit_result = operand_a_i & ~shift_result; |
| ALU_SBINV: singlebit_result = operand_a_i ^ shift_result; |
| default: singlebit_result = {31'h00000000, shift_result[0]}; |
| endcase |
| wire [4:0] zbp_shift_amt; |
| wire gorc_op; |
| assign gorc_op = operator_i == ALU_GORC; |
| assign zbp_shift_amt[2:0] = (RV32B == RV32BFull ? shift_amt[2:0] : {3 {&shift_amt[2:0]}}); |
| assign zbp_shift_amt[4:3] = (RV32B == RV32BFull ? shift_amt[4:3] : {2 {&shift_amt[4:3]}}); |
| always @(*) begin |
| rev_result = operand_a_i; |
| if (zbp_shift_amt[0]) |
| rev_result = ((gorc_op ? rev_result : 32'h00000000) | ((rev_result & 32'h55555555) << 1)) | ((rev_result & 32'haaaaaaaa) >> 1); |
| if (zbp_shift_amt[1]) |
| rev_result = ((gorc_op ? rev_result : 32'h00000000) | ((rev_result & 32'h33333333) << 2)) | ((rev_result & 32'hcccccccc) >> 2); |
| if (zbp_shift_amt[2]) |
| rev_result = ((gorc_op ? rev_result : 32'h00000000) | ((rev_result & 32'h0f0f0f0f) << 4)) | ((rev_result & 32'hf0f0f0f0) >> 4); |
| if (zbp_shift_amt[3]) |
| rev_result = ((gorc_op & (RV32B == RV32BFull) ? rev_result : 32'h00000000) | ((rev_result & 32'h00ff00ff) << 8)) | ((rev_result & 32'hff00ff00) >> 8); |
| if (zbp_shift_amt[4]) |
| rev_result = ((gorc_op & (RV32B == RV32BFull) ? rev_result : 32'h00000000) | ((rev_result & 32'h0000ffff) << 16)) | ((rev_result & 32'hffff0000) >> 16); |
| end |
| wire crc_hmode; |
| wire crc_bmode; |
| wire [31:0] clmul_result_rev; |
| if (RV32B == RV32BFull) begin : gen_alu_rvb_full |
| localparam [127:0] SHUFFLE_MASK_L = {32'h00ff0000, 32'h0f000f00, 32'h30303030, 32'h44444444}; |
| localparam [127:0] SHUFFLE_MASK_R = {32'h0000ff00, 32'h00f000f0, 32'h0c0c0c0c, 32'h22222222}; |
| localparam [127:0] FLIP_MASK_L = {32'h22001100, 32'h00440000, 32'h44110000, 32'h11000000}; |
| localparam [127:0] FLIP_MASK_R = {32'h00880044, 32'h00002200, 32'h00008822, 32'h00000088}; |
| wire [31:0] SHUFFLE_MASK_NOT [0:3]; |
| for (i = 0; i < 4; i = i + 1) begin : gen_shuffle_mask_not |
| assign SHUFFLE_MASK_NOT[i] = ~(SHUFFLE_MASK_L[(3 - i) * 32+:32] | SHUFFLE_MASK_R[(3 - i) * 32+:32]); |
| end |
| wire shuffle_flip; |
| assign shuffle_flip = operator_i == ALU_UNSHFL; |
| reg [3:0] shuffle_mode; |
| always @(*) begin |
| shuffle_result = operand_a_i; |
| if (shuffle_flip) begin |
| shuffle_mode[3] = shift_amt[0]; |
| shuffle_mode[2] = shift_amt[1]; |
| shuffle_mode[1] = shift_amt[2]; |
| shuffle_mode[0] = shift_amt[3]; |
| end |
| else |
| shuffle_mode = shift_amt[3:0]; |
| if (shuffle_flip) |
| shuffle_result = ((((((((shuffle_result & 32'h88224411) | ((shuffle_result << 6) & FLIP_MASK_L[96+:32])) | ((shuffle_result >> 6) & FLIP_MASK_R[96+:32])) | ((shuffle_result << 9) & FLIP_MASK_L[64+:32])) | ((shuffle_result >> 9) & FLIP_MASK_R[64+:32])) | ((shuffle_result << 15) & FLIP_MASK_L[32+:32])) | ((shuffle_result >> 15) & FLIP_MASK_R[32+:32])) | ((shuffle_result << 21) & FLIP_MASK_L[0+:32])) | ((shuffle_result >> 21) & FLIP_MASK_R[0+:32]); |
| if (shuffle_mode[3]) |
| shuffle_result = (shuffle_result & SHUFFLE_MASK_NOT[0]) | (((shuffle_result << 8) & SHUFFLE_MASK_L[96+:32]) | ((shuffle_result >> 8) & SHUFFLE_MASK_R[96+:32])); |
| if (shuffle_mode[2]) |
| shuffle_result = (shuffle_result & SHUFFLE_MASK_NOT[1]) | (((shuffle_result << 4) & SHUFFLE_MASK_L[64+:32]) | ((shuffle_result >> 4) & SHUFFLE_MASK_R[64+:32])); |
| if (shuffle_mode[1]) |
| shuffle_result = (shuffle_result & SHUFFLE_MASK_NOT[2]) | (((shuffle_result << 2) & SHUFFLE_MASK_L[32+:32]) | ((shuffle_result >> 2) & SHUFFLE_MASK_R[32+:32])); |
| if (shuffle_mode[0]) |
| shuffle_result = (shuffle_result & SHUFFLE_MASK_NOT[3]) | (((shuffle_result << 1) & SHUFFLE_MASK_L[0+:32]) | ((shuffle_result >> 1) & SHUFFLE_MASK_R[0+:32])); |
| if (shuffle_flip) |
| shuffle_result = ((((((((shuffle_result & 32'h88224411) | ((shuffle_result << 6) & FLIP_MASK_L[96+:32])) | ((shuffle_result >> 6) & FLIP_MASK_R[96+:32])) | ((shuffle_result << 9) & FLIP_MASK_L[64+:32])) | ((shuffle_result >> 9) & FLIP_MASK_R[64+:32])) | ((shuffle_result << 15) & FLIP_MASK_L[32+:32])) | ((shuffle_result >> 15) & FLIP_MASK_R[32+:32])) | ((shuffle_result << 21) & FLIP_MASK_L[0+:32])) | ((shuffle_result >> 21) & FLIP_MASK_R[0+:32]); |
| end |
| reg [191:0] bitcnt_partial_q; |
| for (i = 0; i < 32; i = i + 1) begin : gen_bitcnt_reg_in_lsb |
| assign bitcnt_partial_lsb_d[i] = bitcnt_partial[(31 - i) * 6]; |
| end |
| for (i = 0; i < 16; i = i + 1) begin : gen_bitcnt_reg_in_b1 |
| assign bitcnt_partial_msb_d[i] = bitcnt_partial[((31 - ((2 * i) + 1)) * 6) + 1]; |
| end |
| for (i = 0; i < 8; i = i + 1) begin : gen_bitcnt_reg_in_b2 |
| assign bitcnt_partial_msb_d[16 + i] = bitcnt_partial[((31 - ((4 * i) + 3)) * 6) + 2]; |
| end |
| for (i = 0; i < 4; i = i + 1) begin : gen_bitcnt_reg_in_b3 |
| assign bitcnt_partial_msb_d[24 + i] = bitcnt_partial[((31 - ((8 * i) + 7)) * 6) + 3]; |
| end |
| for (i = 0; i < 2; i = i + 1) begin : gen_bitcnt_reg_in_b4 |
| assign bitcnt_partial_msb_d[28 + i] = bitcnt_partial[((31 - ((16 * i) + 15)) * 6) + 4]; |
| end |
| assign bitcnt_partial_msb_d[30] = bitcnt_partial[5]; |
| assign bitcnt_partial_msb_d[31] = 1'b0; |
| always @(*) begin |
| bitcnt_partial_q = {32 {6'b000000}}; |
| begin : sv2v_autoblock_64 |
| reg [31:0] i; |
| for (i = 0; i < 32; i = i + 1) |
| begin : gen_bitcnt_reg_out_lsb |
| bitcnt_partial_q[(31 - i) * 6] = imd_val_q_i[32 + i]; |
| end |
| end |
| begin : sv2v_autoblock_65 |
| reg [31:0] i; |
| for (i = 0; i < 16; i = i + 1) |
| begin : gen_bitcnt_reg_out_b1 |
| bitcnt_partial_q[((31 - ((2 * i) + 1)) * 6) + 1] = imd_val_q_i[i]; |
| end |
| end |
| begin : sv2v_autoblock_66 |
| reg [31:0] i; |
| for (i = 0; i < 8; i = i + 1) |
| begin : gen_bitcnt_reg_out_b2 |
| bitcnt_partial_q[((31 - ((4 * i) + 3)) * 6) + 2] = imd_val_q_i[16 + i]; |
| end |
| end |
| begin : sv2v_autoblock_67 |
| reg [31:0] i; |
| for (i = 0; i < 4; i = i + 1) |
| begin : gen_bitcnt_reg_out_b3 |
| bitcnt_partial_q[((31 - ((8 * i) + 7)) * 6) + 3] = imd_val_q_i[24 + i]; |
| end |
| end |
| begin : sv2v_autoblock_68 |
| reg [31:0] i; |
| for (i = 0; i < 2; i = i + 1) |
| begin : gen_bitcnt_reg_out_b4 |
| bitcnt_partial_q[((31 - ((16 * i) + 15)) * 6) + 4] = imd_val_q_i[28 + i]; |
| end |
| end |
| bitcnt_partial_q[5] = imd_val_q_i[30]; |
| end |
| wire [31:0] butterfly_mask_l [0:4]; |
| wire [31:0] butterfly_mask_r [0:4]; |
| wire [31:0] butterfly_mask_not [0:4]; |
| wire [31:0] lrotc_stage [0:4]; |
| genvar stg; |
| for (stg = 0; stg < 5; stg = stg + 1) begin : gen_butterfly_ctrl_stage |
| genvar seg; |
| for (seg = 0; seg < (2 ** stg); seg = seg + 1) begin : gen_butterfly_ctrl |
| assign lrotc_stage[stg][((2 * (16 >> stg)) * (seg + 1)) - 1:(2 * (16 >> stg)) * seg] = {{16 >> stg {1'b0}}, {16 >> stg {1'b1}}} << bitcnt_partial_q[((32 - ((16 >> stg) * ((2 * seg) + 1))) * 6) + ($clog2(16 >> stg) >= 0 ? $clog2(16 >> stg) : ($clog2(16 >> stg) + ($clog2(16 >> stg) >= 0 ? $clog2(16 >> stg) + 1 : 1 - $clog2(16 >> stg))) - 1)-:($clog2(16 >> stg) >= 0 ? $clog2(16 >> stg) + 1 : 1 - $clog2(16 >> stg))]; |
| assign butterfly_mask_l[stg][((16 >> stg) * ((2 * seg) + 2)) - 1:(16 >> stg) * ((2 * seg) + 1)] = ~lrotc_stage[stg][((16 >> stg) * ((2 * seg) + 2)) - 1:(16 >> stg) * ((2 * seg) + 1)]; |
| assign butterfly_mask_r[stg][((16 >> stg) * ((2 * seg) + 1)) - 1:(16 >> stg) * (2 * seg)] = ~lrotc_stage[stg][((16 >> stg) * ((2 * seg) + 2)) - 1:(16 >> stg) * ((2 * seg) + 1)]; |
| assign butterfly_mask_l[stg][((16 >> stg) * ((2 * seg) + 1)) - 1:(16 >> stg) * (2 * seg)] = {((((16 >> stg) * ((2 * seg) + 1)) - 1) >= ((16 >> stg) * (2 * seg)) ? ((((16 >> stg) * ((2 * seg) + 1)) - 1) - ((16 >> stg) * (2 * seg))) + 1 : (((16 >> stg) * (2 * seg)) - (((16 >> stg) * ((2 * seg) + 1)) - 1)) + 1) {1'sb0}}; |
| assign butterfly_mask_r[stg][((16 >> stg) * ((2 * seg) + 2)) - 1:(16 >> stg) * ((2 * seg) + 1)] = {((((16 >> stg) * ((2 * seg) + 2)) - 1) >= ((16 >> stg) * ((2 * seg) + 1)) ? ((((16 >> stg) * ((2 * seg) + 2)) - 1) - ((16 >> stg) * ((2 * seg) + 1))) + 1 : (((16 >> stg) * ((2 * seg) + 1)) - (((16 >> stg) * ((2 * seg) + 2)) - 1)) + 1) {1'sb0}}; |
| end |
| end |
| for (stg = 0; stg < 5; stg = stg + 1) begin : gen_butterfly_not |
| assign butterfly_mask_not[stg] = ~(butterfly_mask_l[stg] | butterfly_mask_r[stg]); |
| end |
| always @(*) begin |
| butterfly_result = operand_a_i; |
| butterfly_result = ((butterfly_result & butterfly_mask_not[0]) | ((butterfly_result & butterfly_mask_l[0]) >> 16)) | ((butterfly_result & butterfly_mask_r[0]) << 16); |
| butterfly_result = ((butterfly_result & butterfly_mask_not[1]) | ((butterfly_result & butterfly_mask_l[1]) >> 8)) | ((butterfly_result & butterfly_mask_r[1]) << 8); |
| butterfly_result = ((butterfly_result & butterfly_mask_not[2]) | ((butterfly_result & butterfly_mask_l[2]) >> 4)) | ((butterfly_result & butterfly_mask_r[2]) << 4); |
| butterfly_result = ((butterfly_result & butterfly_mask_not[3]) | ((butterfly_result & butterfly_mask_l[3]) >> 2)) | ((butterfly_result & butterfly_mask_r[3]) << 2); |
| butterfly_result = ((butterfly_result & butterfly_mask_not[4]) | ((butterfly_result & butterfly_mask_l[4]) >> 1)) | ((butterfly_result & butterfly_mask_r[4]) << 1); |
| butterfly_result = butterfly_result & operand_b_i; |
| end |
| always @(*) begin |
| invbutterfly_result = operand_a_i & operand_b_i; |
| invbutterfly_result = ((invbutterfly_result & butterfly_mask_not[4]) | ((invbutterfly_result & butterfly_mask_l[4]) >> 1)) | ((invbutterfly_result & butterfly_mask_r[4]) << 1); |
| invbutterfly_result = ((invbutterfly_result & butterfly_mask_not[3]) | ((invbutterfly_result & butterfly_mask_l[3]) >> 2)) | ((invbutterfly_result & butterfly_mask_r[3]) << 2); |
| invbutterfly_result = ((invbutterfly_result & butterfly_mask_not[2]) | ((invbutterfly_result & butterfly_mask_l[2]) >> 4)) | ((invbutterfly_result & butterfly_mask_r[2]) << 4); |
| invbutterfly_result = ((invbutterfly_result & butterfly_mask_not[1]) | ((invbutterfly_result & butterfly_mask_l[1]) >> 8)) | ((invbutterfly_result & butterfly_mask_r[1]) << 8); |
| invbutterfly_result = ((invbutterfly_result & butterfly_mask_not[0]) | ((invbutterfly_result & butterfly_mask_l[0]) >> 16)) | ((invbutterfly_result & butterfly_mask_r[0]) << 16); |
| end |
| wire clmul_rmode; |
| wire clmul_hmode; |
| reg [31:0] clmul_op_a; |
| reg [31:0] clmul_op_b; |
| wire [31:0] operand_b_rev; |
| wire [31:0] clmul_and_stage [0:31]; |
| wire [31:0] clmul_xor_stage1 [0:15]; |
| wire [31:0] clmul_xor_stage2 [0:7]; |
| wire [31:0] clmul_xor_stage3 [0:3]; |
| wire [31:0] clmul_xor_stage4 [0:1]; |
| wire [31:0] clmul_result_raw; |
| for (i = 0; i < 32; i = i + 1) begin : gen_rev_operand_b |
| assign operand_b_rev[i] = operand_b_i[31 - i]; |
| end |
| assign clmul_rmode = operator_i == ALU_CLMULR; |
| assign clmul_hmode = operator_i == ALU_CLMULH; |
| localparam [31:0] CRC32_POLYNOMIAL = 32'h04c11db7; |
| localparam [31:0] CRC32_MU_REV = 32'hf7011641; |
| localparam [31:0] CRC32C_POLYNOMIAL = 32'h1edc6f41; |
| localparam [31:0] CRC32C_MU_REV = 32'hdea713f1; |
| wire crc_op; |
| wire crc_cpoly; |
| reg [31:0] crc_operand; |
| wire [31:0] crc_poly; |
| wire [31:0] crc_mu_rev; |
| assign crc_op = (((((operator_i == ALU_CRC32C_W) | (operator_i == ALU_CRC32_W)) | (operator_i == ALU_CRC32C_H)) | (operator_i == ALU_CRC32_H)) | (operator_i == ALU_CRC32C_B)) | (operator_i == ALU_CRC32_B); |
| assign crc_cpoly = ((operator_i == ALU_CRC32C_W) | (operator_i == ALU_CRC32C_H)) | (operator_i == ALU_CRC32C_B); |
| assign crc_hmode = (operator_i == ALU_CRC32_H) | (operator_i == ALU_CRC32C_H); |
| assign crc_bmode = (operator_i == ALU_CRC32_B) | (operator_i == ALU_CRC32C_B); |
| assign crc_poly = (crc_cpoly ? CRC32C_POLYNOMIAL : CRC32_POLYNOMIAL); |
| assign crc_mu_rev = (crc_cpoly ? CRC32C_MU_REV : CRC32_MU_REV); |
| always @(*) |
| case (1'b1) |
| crc_bmode: crc_operand = {operand_a_i[7:0], 24'h000000}; |
| crc_hmode: crc_operand = {operand_a_i[15:0], 16'h0000}; |
| default: crc_operand = operand_a_i; |
| endcase |
| always @(*) |
| if (crc_op) begin |
| clmul_op_a = (instr_first_cycle_i ? crc_operand : imd_val_q_i[32+:32]); |
| clmul_op_b = (instr_first_cycle_i ? crc_mu_rev : crc_poly); |
| end |
| else begin |
| clmul_op_a = (clmul_rmode | clmul_hmode ? operand_a_rev : operand_a_i); |
| clmul_op_b = (clmul_rmode | clmul_hmode ? operand_b_rev : operand_b_i); |
| end |
| for (i = 0; i < 32; i = i + 1) begin : gen_clmul_and_op |
| assign clmul_and_stage[i] = (clmul_op_b[i] ? clmul_op_a << i : {32 {1'sb0}}); |
| end |
| for (i = 0; i < 16; i = i + 1) begin : gen_clmul_xor_op_l1 |
| assign clmul_xor_stage1[i] = clmul_and_stage[2 * i] ^ clmul_and_stage[(2 * i) + 1]; |
| end |
| for (i = 0; i < 8; i = i + 1) begin : gen_clmul_xor_op_l2 |
| assign clmul_xor_stage2[i] = clmul_xor_stage1[2 * i] ^ clmul_xor_stage1[(2 * i) + 1]; |
| end |
| for (i = 0; i < 4; i = i + 1) begin : gen_clmul_xor_op_l3 |
| assign clmul_xor_stage3[i] = clmul_xor_stage2[2 * i] ^ clmul_xor_stage2[(2 * i) + 1]; |
| end |
| for (i = 0; i < 2; i = i + 1) begin : gen_clmul_xor_op_l4 |
| assign clmul_xor_stage4[i] = clmul_xor_stage3[2 * i] ^ clmul_xor_stage3[(2 * i) + 1]; |
| end |
| assign clmul_result_raw = clmul_xor_stage4[0] ^ clmul_xor_stage4[1]; |
| for (i = 0; i < 32; i = i + 1) begin : gen_rev_clmul_result |
| assign clmul_result_rev[i] = clmul_result_raw[31 - i]; |
| end |
| always @(*) |
| case (1'b1) |
| clmul_rmode: clmul_result = clmul_result_rev; |
| clmul_hmode: clmul_result = {1'b0, clmul_result_rev[31:1]}; |
| default: clmul_result = clmul_result_raw; |
| endcase |
| end |
| else begin : gen_alu_rvb_notfull |
| always @(*) shuffle_result = {32 {1'sb0}}; |
| always @(*) butterfly_result = {32 {1'sb0}}; |
| always @(*) invbutterfly_result = {32 {1'sb0}}; |
| always @(*) clmul_result = {32 {1'sb0}}; |
| assign bitcnt_partial_lsb_d = {32 {1'sb0}}; |
| assign bitcnt_partial_msb_d = {32 {1'sb0}}; |
| assign clmul_result_rev = {32 {1'sb0}}; |
| assign crc_bmode = 1'sb0; |
| assign crc_hmode = 1'sb0; |
| end |
| always @(*) |
| case (operator_i) |
| ALU_CMOV: begin |
| multicycle_result = (operand_b_i == 32'h00000000 ? operand_a_i : imd_val_q_i[32+:32]); |
| imd_val_d_o = {operand_a_i, 32'h00000000}; |
| if (instr_first_cycle_i) |
| imd_val_we_o = 2'b01; |
| else |
| imd_val_we_o = 2'b00; |
| end |
| ALU_CMIX: begin |
| multicycle_result = imd_val_q_i[32+:32] | bwlogic_and_result; |
| imd_val_d_o = {bwlogic_and_result, 32'h00000000}; |
| if (instr_first_cycle_i) |
| imd_val_we_o = 2'b01; |
| else |
| imd_val_we_o = 2'b00; |
| end |
| ALU_FSR, ALU_FSL, ALU_ROL, ALU_ROR: begin |
| if (shift_amt[4:0] == 5'h00) |
| multicycle_result = (shift_amt[5] ? operand_a_i : imd_val_q_i[32+:32]); |
| else |
| multicycle_result = imd_val_q_i[32+:32] | shift_result; |
| imd_val_d_o = {shift_result, 32'h00000000}; |
| if (instr_first_cycle_i) |
| imd_val_we_o = 2'b01; |
| else |
| imd_val_we_o = 2'b00; |
| end |
| ALU_CRC32_W, ALU_CRC32C_W, ALU_CRC32_H, ALU_CRC32C_H, ALU_CRC32_B, ALU_CRC32C_B: |
| if (RV32B == RV32BFull) begin |
| case (1'b1) |
| crc_bmode: multicycle_result = clmul_result_rev ^ (operand_a_i >> 8); |
| crc_hmode: multicycle_result = clmul_result_rev ^ (operand_a_i >> 16); |
| default: multicycle_result = clmul_result_rev; |
| endcase |
| imd_val_d_o = {clmul_result_rev, 32'h00000000}; |
| if (instr_first_cycle_i) |
| imd_val_we_o = 2'b01; |
| else |
| imd_val_we_o = 2'b00; |
| end |
| else begin |
| imd_val_d_o = {operand_a_i, 32'h00000000}; |
| imd_val_we_o = 2'b00; |
| multicycle_result = {32 {1'sb0}}; |
| end |
| ALU_BEXT, ALU_BDEP: |
| if (RV32B == RV32BFull) begin |
| multicycle_result = (operator_i == ALU_BDEP ? butterfly_result : invbutterfly_result); |
| imd_val_d_o = {bitcnt_partial_lsb_d, bitcnt_partial_msb_d}; |
| if (instr_first_cycle_i) |
| imd_val_we_o = 2'b11; |
| else |
| imd_val_we_o = 2'b00; |
| end |
| else begin |
| imd_val_d_o = {operand_a_i, 32'h00000000}; |
| imd_val_we_o = 2'b00; |
| multicycle_result = {32 {1'sb0}}; |
| end |
| default: begin |
| imd_val_d_o = {operand_a_i, 32'h00000000}; |
| imd_val_we_o = 2'b00; |
| multicycle_result = {32 {1'sb0}}; |
| end |
| endcase |
| end |
| else begin : g_no_alu_rvb |
| assign bitcnt_result = {6 {1'sb0}}; |
| assign minmax_result = {32 {1'sb0}}; |
| always @(*) pack_result = {32 {1'sb0}}; |
| assign sext_result = {32 {1'sb0}}; |
| always @(*) singlebit_result = {32 {1'sb0}}; |
| always @(*) rev_result = {32 {1'sb0}}; |
| always @(*) shuffle_result = {32 {1'sb0}}; |
| always @(*) butterfly_result = {32 {1'sb0}}; |
| always @(*) invbutterfly_result = {32 {1'sb0}}; |
| always @(*) clmul_result = {32 {1'sb0}}; |
| always @(*) multicycle_result = {32 {1'sb0}}; |
| always @(*) imd_val_d_o = {2 {32'b00000000000000000000000000000000}}; |
| always @(*) imd_val_we_o = {2 {1'sb0}}; |
| end |
| endgenerate |
| always @(*) begin |
| result_o = {32 {1'sb0}}; |
| case (operator_i) |
| ALU_XOR, ALU_XNOR, ALU_OR, ALU_ORN, ALU_AND, ALU_ANDN: result_o = bwlogic_result; |
| ALU_ADD, ALU_SUB: result_o = adder_result; |
| ALU_SLL, ALU_SRL, ALU_SRA, ALU_SLO, ALU_SRO: result_o = shift_result; |
| ALU_SHFL, ALU_UNSHFL: result_o = shuffle_result; |
| ALU_EQ, ALU_NE, ALU_GE, ALU_GEU, ALU_LT, ALU_LTU, ALU_SLT, ALU_SLTU: result_o = {31'h00000000, cmp_result}; |
| ALU_MIN, ALU_MAX, ALU_MINU, ALU_MAXU: result_o = minmax_result; |
| ALU_CLZ, ALU_CTZ, ALU_PCNT: result_o = {26'h0000000, bitcnt_result}; |
| ALU_PACK, ALU_PACKH, ALU_PACKU: result_o = pack_result; |
| ALU_SEXTB, ALU_SEXTH: result_o = sext_result; |
| ALU_CMIX, ALU_CMOV, ALU_FSL, ALU_FSR, ALU_ROL, ALU_ROR, ALU_CRC32_W, ALU_CRC32C_W, ALU_CRC32_H, ALU_CRC32C_H, ALU_CRC32_B, ALU_CRC32C_B, ALU_BEXT, ALU_BDEP: result_o = multicycle_result; |
| ALU_SBSET, ALU_SBCLR, ALU_SBINV, ALU_SBEXT: result_o = singlebit_result; |
| ALU_GREV, ALU_GORC: result_o = rev_result; |
| ALU_BFP: result_o = bfp_result; |
| ALU_CLMUL, ALU_CLMULR, ALU_CLMULH: result_o = clmul_result; |
| default: |
| ; |
| endcase |
| end |
| endmodule |
| module brqrv_exu_multdiv_fast ( |
| clk_i, |
| rst_ni, |
| mult_en_i, |
| div_en_i, |
| mult_sel_i, |
| div_sel_i, |
| operator_i, |
| signed_mode_i, |
| op_a_i, |
| op_b_i, |
| alu_adder_ext_i, |
| alu_adder_i, |
| equal_to_zero_i, |
| data_ind_timing_i, |
| alu_operand_a_o, |
| alu_operand_b_o, |
| imd_val_q_i, |
| imd_val_d_o, |
| imd_val_we_o, |
| multdiv_ready_id_i, |
| multdiv_result_o, |
| valid_o |
| ); |
| localparam integer brqrv_pkg_RV32MFast = 2; |
| parameter integer RV32M = brqrv_pkg_RV32MFast; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire mult_en_i; |
| input wire div_en_i; |
| input wire mult_sel_i; |
| input wire div_sel_i; |
| input wire [1:0] operator_i; |
| input wire [1:0] signed_mode_i; |
| input wire [31:0] op_a_i; |
| input wire [31:0] op_b_i; |
| input wire [33:0] alu_adder_ext_i; |
| input wire [31:0] alu_adder_i; |
| input wire equal_to_zero_i; |
| input wire data_ind_timing_i; |
| output reg [32:0] alu_operand_a_o; |
| output reg [32:0] alu_operand_b_o; |
| input wire [67:0] imd_val_q_i; |
| output wire [67:0] imd_val_d_o; |
| output wire [1:0] imd_val_we_o; |
| input wire multdiv_ready_id_i; |
| output wire [31:0] multdiv_result_o; |
| output wire valid_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| wire signed [34:0] mac_res_signed; |
| wire [34:0] mac_res_ext; |
| reg [33:0] accum; |
| reg sign_a; |
| reg sign_b; |
| reg mult_valid; |
| wire signed_mult; |
| reg [33:0] mac_res_d; |
| reg [33:0] op_remainder_d; |
| wire [33:0] mac_res; |
| wire div_sign_a; |
| wire div_sign_b; |
| reg is_greater_equal; |
| wire div_change_sign; |
| wire rem_change_sign; |
| wire [31:0] one_shift; |
| wire [31:0] op_denominator_q; |
| reg [31:0] op_numerator_q; |
| reg [31:0] op_quotient_q; |
| reg [31:0] op_denominator_d; |
| reg [31:0] op_numerator_d; |
| reg [31:0] op_quotient_d; |
| wire [31:0] next_remainder; |
| wire [32:0] next_quotient; |
| wire [32:0] res_adder_h; |
| reg div_valid; |
| reg [4:0] div_counter_q; |
| reg [4:0] div_counter_d; |
| wire multdiv_en; |
| reg mult_hold; |
| reg div_hold; |
| reg div_by_zero_d; |
| reg div_by_zero_q; |
| wire mult_en_internal; |
| wire div_en_internal; |
| reg [2:0] md_state_q; |
| reg [2:0] md_state_d; |
| wire unused_mult_sel_i; |
| assign unused_mult_sel_i = mult_sel_i; |
| assign mult_en_internal = mult_en_i & ~mult_hold; |
| assign div_en_internal = div_en_i & ~div_hold; |
| localparam [2:0] MD_IDLE = 0; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| div_counter_q <= {5 {1'sb0}}; |
| md_state_q <= MD_IDLE; |
| op_numerator_q <= {32 {1'sb0}}; |
| op_quotient_q <= {32 {1'sb0}}; |
| div_by_zero_q <= 1'sb0; |
| end |
| else if (div_en_internal) begin |
| div_counter_q <= div_counter_d; |
| op_numerator_q <= op_numerator_d; |
| op_quotient_q <= op_quotient_d; |
| md_state_q <= md_state_d; |
| div_by_zero_q <= div_by_zero_d; |
| end |
| assign multdiv_en = mult_en_internal | div_en_internal; |
| assign imd_val_d_o[34+:34] = (div_sel_i ? op_remainder_d : mac_res_d); |
| assign imd_val_we_o[0] = multdiv_en; |
| assign imd_val_d_o[0+:34] = {2'b00, op_denominator_d}; |
| assign imd_val_we_o[1] = div_en_internal; |
| assign op_denominator_q = imd_val_q_i[31-:32]; |
| wire [1:0] unused_imd_val; |
| assign unused_imd_val = imd_val_q_i[33-:2]; |
| assign signed_mult = signed_mode_i != 2'b00; |
| assign multdiv_result_o = (div_sel_i ? imd_val_q_i[65-:32] : mac_res_d[31:0]); |
| localparam [1:0] AHBH = 3; |
| localparam [1:0] AHBL = 2; |
| localparam [1:0] ALBH = 1; |
| localparam [1:0] ALBL = 0; |
| localparam [0:0] MULH = 1; |
| localparam [0:0] MULL = 0; |
| generate |
| if (RV32M == RV32MSingleCycle) begin : gen_mult_single_cycle |
| reg mult_state_q; |
| reg mult_state_d; |
| wire signed [33:0] mult1_res; |
| wire signed [33:0] mult2_res; |
| wire signed [33:0] mult3_res; |
| wire [15:0] mult1_op_a; |
| wire [15:0] mult1_op_b; |
| wire [15:0] mult2_op_a; |
| wire [15:0] mult2_op_b; |
| reg [15:0] mult3_op_a; |
| reg [15:0] mult3_op_b; |
| wire mult1_sign_a; |
| wire mult1_sign_b; |
| wire mult2_sign_a; |
| wire mult2_sign_b; |
| reg mult3_sign_a; |
| reg mult3_sign_b; |
| reg [33:0] summand1; |
| reg [33:0] summand2; |
| reg [33:0] summand3; |
| assign mult1_res = $signed({mult1_sign_a, mult1_op_a}) * $signed({mult1_sign_b, mult1_op_b}); |
| assign mult2_res = $signed({mult2_sign_a, mult2_op_a}) * $signed({mult2_sign_b, mult2_op_b}); |
| assign mult3_res = $signed({mult3_sign_a, mult3_op_a}) * $signed({mult3_sign_b, mult3_op_b}); |
| assign mac_res_signed = ($signed(summand1) + $signed(summand2)) + $signed(summand3); |
| assign mac_res_ext = $unsigned(mac_res_signed); |
| assign mac_res = mac_res_ext[33:0]; |
| always @(*) sign_a = signed_mode_i[0] & op_a_i[31]; |
| always @(*) sign_b = signed_mode_i[1] & op_b_i[31]; |
| assign mult1_sign_a = 1'b0; |
| assign mult1_sign_b = 1'b0; |
| assign mult1_op_a = op_a_i[15:0]; |
| assign mult1_op_b = op_b_i[15:0]; |
| assign mult2_sign_a = 1'b0; |
| assign mult2_sign_b = sign_b; |
| assign mult2_op_a = op_a_i[15:0]; |
| assign mult2_op_b = op_b_i[31:16]; |
| always @(*) accum[17:0] = imd_val_q_i[67-:18]; |
| always @(*) accum[33:18] = {16 {signed_mult & imd_val_q_i[67]}}; |
| always @(*) begin |
| mult3_sign_a = sign_a; |
| mult3_sign_b = 1'b0; |
| mult3_op_a = op_a_i[31:16]; |
| mult3_op_b = op_b_i[15:0]; |
| summand1 = {18'h00000, mult1_res[31:16]}; |
| summand2 = mult2_res; |
| summand3 = mult3_res; |
| mac_res_d = {2'b00, mac_res[15:0], mult1_res[15:0]}; |
| mult_valid = mult_en_i; |
| mult_state_d = MULL; |
| mult_hold = 1'b0; |
| case (mult_state_q) |
| MULL: |
| if (operator_i != MD_OP_MULL) begin |
| mac_res_d = mac_res; |
| mult_valid = 1'b0; |
| mult_state_d = MULH; |
| end |
| else |
| mult_hold = ~multdiv_ready_id_i; |
| MULH: begin |
| mult3_sign_a = sign_a; |
| mult3_sign_b = sign_b; |
| mult3_op_a = op_a_i[31:16]; |
| mult3_op_b = op_b_i[31:16]; |
| mac_res_d = mac_res; |
| summand1 = {34 {1'sb0}}; |
| summand2 = accum; |
| summand3 = mult3_res; |
| mult_state_d = MULL; |
| mult_valid = 1'b1; |
| mult_hold = ~multdiv_ready_id_i; |
| end |
| default: mult_state_d = MULL; |
| endcase |
| end |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| mult_state_q <= MULL; |
| else if (mult_en_internal) |
| mult_state_q <= mult_state_d; |
| end |
| else begin : gen_mult_fast |
| reg [15:0] mult_op_a; |
| reg [15:0] mult_op_b; |
| reg [1:0] mult_state_q; |
| reg [1:0] mult_state_d; |
| assign mac_res_signed = ($signed({sign_a, mult_op_a}) * $signed({sign_b, mult_op_b})) + $signed(accum); |
| assign mac_res_ext = $unsigned(mac_res_signed); |
| assign mac_res = mac_res_ext[33:0]; |
| always @(*) begin |
| mult_op_a = op_a_i[15:0]; |
| mult_op_b = op_b_i[15:0]; |
| sign_a = 1'b0; |
| sign_b = 1'b0; |
| accum = imd_val_q_i[34+:34]; |
| mac_res_d = mac_res; |
| mult_state_d = mult_state_q; |
| mult_valid = 1'b0; |
| mult_hold = 1'b0; |
| case (mult_state_q) |
| ALBL: begin |
| mult_op_a = op_a_i[15:0]; |
| mult_op_b = op_b_i[15:0]; |
| sign_a = 1'b0; |
| sign_b = 1'b0; |
| accum = {34 {1'sb0}}; |
| mac_res_d = mac_res; |
| mult_state_d = ALBH; |
| end |
| ALBH: begin |
| mult_op_a = op_a_i[15:0]; |
| mult_op_b = op_b_i[31:16]; |
| sign_a = 1'b0; |
| sign_b = signed_mode_i[1] & op_b_i[31]; |
| accum = {18'b000000000000000000, imd_val_q_i[65-:16]}; |
| if (operator_i == MD_OP_MULL) |
| mac_res_d = {2'b00, mac_res[15:0], imd_val_q_i[49-:16]}; |
| else |
| mac_res_d = mac_res; |
| mult_state_d = AHBL; |
| end |
| AHBL: begin |
| mult_op_a = op_a_i[31:16]; |
| mult_op_b = op_b_i[15:0]; |
| sign_a = signed_mode_i[0] & op_a_i[31]; |
| sign_b = 1'b0; |
| if (operator_i == MD_OP_MULL) begin |
| accum = {18'b000000000000000000, imd_val_q_i[65-:16]}; |
| mac_res_d = {2'b00, mac_res[15:0], imd_val_q_i[49-:16]}; |
| mult_valid = 1'b1; |
| mult_state_d = ALBL; |
| mult_hold = ~multdiv_ready_id_i; |
| end |
| else begin |
| accum = imd_val_q_i[34+:34]; |
| mac_res_d = mac_res; |
| mult_state_d = AHBH; |
| end |
| end |
| AHBH: begin |
| mult_op_a = op_a_i[31:16]; |
| mult_op_b = op_b_i[31:16]; |
| sign_a = signed_mode_i[0] & op_a_i[31]; |
| sign_b = signed_mode_i[1] & op_b_i[31]; |
| accum[17:0] = imd_val_q_i[67-:18]; |
| accum[33:18] = {16 {signed_mult & imd_val_q_i[67]}}; |
| mac_res_d = mac_res; |
| mult_valid = 1'b1; |
| mult_state_d = ALBL; |
| mult_hold = ~multdiv_ready_id_i; |
| end |
| default: mult_state_d = ALBL; |
| endcase |
| end |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| mult_state_q <= ALBL; |
| else if (mult_en_internal) |
| mult_state_q <= mult_state_d; |
| end |
| endgenerate |
| assign res_adder_h = alu_adder_ext_i[33:1]; |
| assign next_remainder = (is_greater_equal ? res_adder_h[31:0] : imd_val_q_i[65-:32]); |
| assign next_quotient = (is_greater_equal ? {1'b0, op_quotient_q} | {1'b0, one_shift} : {1'b0, op_quotient_q}); |
| assign one_shift = {31'b0000000000000000000000000000000, 1'b1} << div_counter_q; |
| always @(*) |
| if ((imd_val_q_i[65] ^ op_denominator_q[31]) == 1'b0) |
| is_greater_equal = res_adder_h[31] == 1'b0; |
| else |
| is_greater_equal = imd_val_q_i[65]; |
| assign div_sign_a = op_a_i[31] & signed_mode_i[0]; |
| assign div_sign_b = op_b_i[31] & signed_mode_i[1]; |
| assign div_change_sign = (div_sign_a ^ div_sign_b) & ~div_by_zero_q; |
| assign rem_change_sign = div_sign_a; |
| localparam [2:0] MD_ABS_A = 1; |
| localparam [2:0] MD_ABS_B = 2; |
| localparam [2:0] MD_CHANGE_SIGN = 5; |
| localparam [2:0] MD_COMP = 3; |
| localparam [2:0] MD_FINISH = 6; |
| localparam [2:0] MD_LAST = 4; |
| always @(*) begin |
| div_counter_d = div_counter_q - 5'h01; |
| op_remainder_d = imd_val_q_i[34+:34]; |
| op_quotient_d = op_quotient_q; |
| md_state_d = md_state_q; |
| op_numerator_d = op_numerator_q; |
| op_denominator_d = op_denominator_q; |
| alu_operand_a_o = {32'h00000000, 1'b1}; |
| alu_operand_b_o = {~op_b_i, 1'b1}; |
| div_valid = 1'b0; |
| div_hold = 1'b0; |
| div_by_zero_d = div_by_zero_q; |
| case (md_state_q) |
| MD_IDLE: begin |
| if (operator_i == MD_OP_DIV) begin |
| op_remainder_d = {34 {1'sb1}}; |
| md_state_d = (!data_ind_timing_i && equal_to_zero_i ? MD_FINISH : MD_ABS_A); |
| div_by_zero_d = equal_to_zero_i; |
| end |
| else begin |
| op_remainder_d = {2'b00, op_a_i}; |
| md_state_d = (!data_ind_timing_i && equal_to_zero_i ? MD_FINISH : MD_ABS_A); |
| end |
| alu_operand_a_o = {32'h00000000, 1'b1}; |
| alu_operand_b_o = {~op_b_i, 1'b1}; |
| div_counter_d = 5'd31; |
| end |
| MD_ABS_A: begin |
| op_quotient_d = {32 {1'sb0}}; |
| op_numerator_d = (div_sign_a ? alu_adder_i : op_a_i); |
| md_state_d = MD_ABS_B; |
| div_counter_d = 5'd31; |
| alu_operand_a_o = {32'h00000000, 1'b1}; |
| alu_operand_b_o = {~op_a_i, 1'b1}; |
| end |
| MD_ABS_B: begin |
| op_remainder_d = {33'h000000000, op_numerator_q[31]}; |
| op_denominator_d = (div_sign_b ? alu_adder_i : op_b_i); |
| md_state_d = MD_COMP; |
| div_counter_d = 5'd31; |
| alu_operand_a_o = {32'h00000000, 1'b1}; |
| alu_operand_b_o = {~op_b_i, 1'b1}; |
| end |
| MD_COMP: begin |
| op_remainder_d = {1'b0, next_remainder[31:0], op_numerator_q[div_counter_d]}; |
| op_quotient_d = next_quotient[31:0]; |
| md_state_d = (div_counter_q == 5'd1 ? MD_LAST : MD_COMP); |
| alu_operand_a_o = {imd_val_q_i[65-:32], 1'b1}; |
| alu_operand_b_o = {~op_denominator_q[31:0], 1'b1}; |
| end |
| MD_LAST: begin |
| if (operator_i == MD_OP_DIV) |
| op_remainder_d = {1'b0, next_quotient}; |
| else |
| op_remainder_d = {2'b00, next_remainder[31:0]}; |
| alu_operand_a_o = {imd_val_q_i[65-:32], 1'b1}; |
| alu_operand_b_o = {~op_denominator_q[31:0], 1'b1}; |
| md_state_d = MD_CHANGE_SIGN; |
| end |
| MD_CHANGE_SIGN: begin |
| md_state_d = MD_FINISH; |
| if (operator_i == MD_OP_DIV) |
| op_remainder_d = (div_change_sign ? {2'h0, alu_adder_i} : imd_val_q_i[34+:34]); |
| else |
| op_remainder_d = (rem_change_sign ? {2'h0, alu_adder_i} : imd_val_q_i[34+:34]); |
| alu_operand_a_o = {32'h00000000, 1'b1}; |
| alu_operand_b_o = {~imd_val_q_i[65-:32], 1'b1}; |
| end |
| MD_FINISH: begin |
| md_state_d = MD_IDLE; |
| div_hold = ~multdiv_ready_id_i; |
| div_valid = 1'b1; |
| end |
| default: md_state_d = MD_IDLE; |
| endcase |
| end |
| assign valid_o = mult_valid | div_valid; |
| endmodule |
| module brqrv_exu_multdiv_slow ( |
| clk_i, |
| rst_ni, |
| mult_en_i, |
| div_en_i, |
| mult_sel_i, |
| div_sel_i, |
| operator_i, |
| signed_mode_i, |
| op_a_i, |
| op_b_i, |
| alu_adder_ext_i, |
| alu_adder_i, |
| equal_to_zero_i, |
| data_ind_timing_i, |
| alu_operand_a_o, |
| alu_operand_b_o, |
| imd_val_q_i, |
| imd_val_d_o, |
| imd_val_we_o, |
| multdiv_ready_id_i, |
| multdiv_result_o, |
| valid_o |
| ); |
| input wire clk_i; |
| input wire rst_ni; |
| input wire mult_en_i; |
| input wire div_en_i; |
| input wire mult_sel_i; |
| input wire div_sel_i; |
| input wire [1:0] operator_i; |
| input wire [1:0] signed_mode_i; |
| input wire [31:0] op_a_i; |
| input wire [31:0] op_b_i; |
| input wire [33:0] alu_adder_ext_i; |
| input wire [31:0] alu_adder_i; |
| input wire equal_to_zero_i; |
| input wire data_ind_timing_i; |
| output reg [32:0] alu_operand_a_o; |
| output reg [32:0] alu_operand_b_o; |
| input wire [67:0] imd_val_q_i; |
| output wire [67:0] imd_val_d_o; |
| output wire [1:0] imd_val_we_o; |
| input wire multdiv_ready_id_i; |
| output wire [31:0] multdiv_result_o; |
| output wire valid_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| reg [2:0] md_state_q; |
| reg [2:0] md_state_d; |
| wire [32:0] accum_window_q; |
| reg [32:0] accum_window_d; |
| wire unused_imd_val0; |
| wire [1:0] unused_imd_val1; |
| wire [32:0] res_adder_l; |
| wire [32:0] res_adder_h; |
| reg [4:0] multdiv_count_q; |
| reg [4:0] multdiv_count_d; |
| reg [32:0] op_b_shift_q; |
| reg [32:0] op_b_shift_d; |
| reg [32:0] op_a_shift_q; |
| reg [32:0] op_a_shift_d; |
| wire [32:0] op_a_ext; |
| wire [32:0] op_b_ext; |
| wire [32:0] one_shift; |
| wire [32:0] op_a_bw_pp; |
| wire [32:0] op_a_bw_last_pp; |
| wire [31:0] b_0; |
| wire sign_a; |
| wire sign_b; |
| wire [32:0] next_quotient; |
| wire [31:0] next_remainder; |
| wire [31:0] op_numerator_q; |
| reg [31:0] op_numerator_d; |
| wire is_greater_equal; |
| wire div_change_sign; |
| wire rem_change_sign; |
| reg div_by_zero_d; |
| reg div_by_zero_q; |
| reg multdiv_hold; |
| wire multdiv_en; |
| assign res_adder_l = alu_adder_ext_i[32:0]; |
| assign res_adder_h = alu_adder_ext_i[33:1]; |
| assign imd_val_d_o[34+:34] = {1'b0, accum_window_d}; |
| assign imd_val_we_o[0] = ~multdiv_hold; |
| assign accum_window_q = imd_val_q_i[66-:33]; |
| assign unused_imd_val0 = imd_val_q_i[67]; |
| assign imd_val_d_o[0+:34] = {2'b00, op_numerator_d}; |
| assign imd_val_we_o[1] = multdiv_en; |
| assign op_numerator_q = imd_val_q_i[31-:32]; |
| assign unused_imd_val1 = imd_val_q_i[33-:2]; |
| localparam [2:0] MD_ABS_A = 1; |
| localparam [2:0] MD_ABS_B = 2; |
| localparam [2:0] MD_CHANGE_SIGN = 5; |
| localparam [2:0] MD_IDLE = 0; |
| localparam [2:0] MD_LAST = 4; |
| always @(*) begin |
| alu_operand_a_o = accum_window_q; |
| case (operator_i) |
| MD_OP_MULL: alu_operand_b_o = op_a_bw_pp; |
| MD_OP_MULH: alu_operand_b_o = (md_state_q == MD_LAST ? op_a_bw_last_pp : op_a_bw_pp); |
| MD_OP_DIV, MD_OP_REM: |
| case (md_state_q) |
| MD_IDLE: begin |
| alu_operand_a_o = {32'h00000000, 1'b1}; |
| alu_operand_b_o = {~op_b_i, 1'b1}; |
| end |
| MD_ABS_A: begin |
| alu_operand_a_o = {32'h00000000, 1'b1}; |
| alu_operand_b_o = {~op_a_i, 1'b1}; |
| end |
| MD_ABS_B: begin |
| alu_operand_a_o = {32'h00000000, 1'b1}; |
| alu_operand_b_o = {~op_b_i, 1'b1}; |
| end |
| MD_CHANGE_SIGN: begin |
| alu_operand_a_o = {32'h00000000, 1'b1}; |
| alu_operand_b_o = {~accum_window_q[31:0], 1'b1}; |
| end |
| default: begin |
| alu_operand_a_o = {accum_window_q[31:0], 1'b1}; |
| alu_operand_b_o = {~op_b_shift_q[31:0], 1'b1}; |
| end |
| endcase |
| default: begin |
| alu_operand_a_o = accum_window_q; |
| alu_operand_b_o = {~op_b_shift_q[31:0], 1'b1}; |
| end |
| endcase |
| end |
| assign b_0 = {32 {op_b_shift_q[0]}}; |
| assign op_a_bw_pp = {~(op_a_shift_q[32] & op_b_shift_q[0]), op_a_shift_q[31:0] & b_0}; |
| assign op_a_bw_last_pp = {op_a_shift_q[32] & op_b_shift_q[0], ~(op_a_shift_q[31:0] & b_0)}; |
| assign sign_a = op_a_i[31] & signed_mode_i[0]; |
| assign sign_b = op_b_i[31] & signed_mode_i[1]; |
| assign op_a_ext = {sign_a, op_a_i}; |
| assign op_b_ext = {sign_b, op_b_i}; |
| assign is_greater_equal = (accum_window_q[31] == op_b_shift_q[31] ? ~res_adder_h[31] : accum_window_q[31]); |
| assign one_shift = {32'b00000000000000000000000000000000, 1'b1} << multdiv_count_q; |
| assign next_remainder = (is_greater_equal ? res_adder_h[31:0] : accum_window_q[31:0]); |
| assign next_quotient = (is_greater_equal ? op_a_shift_q | one_shift : op_a_shift_q); |
| assign div_change_sign = (sign_a ^ sign_b) & ~div_by_zero_q; |
| assign rem_change_sign = sign_a; |
| localparam [2:0] MD_COMP = 3; |
| localparam [2:0] MD_FINISH = 6; |
| always @(*) begin |
| multdiv_count_d = multdiv_count_q; |
| accum_window_d = accum_window_q; |
| op_b_shift_d = op_b_shift_q; |
| op_a_shift_d = op_a_shift_q; |
| op_numerator_d = op_numerator_q; |
| md_state_d = md_state_q; |
| multdiv_hold = 1'b0; |
| div_by_zero_d = div_by_zero_q; |
| if (mult_sel_i || div_sel_i) |
| case (md_state_q) |
| MD_IDLE: begin |
| case (operator_i) |
| MD_OP_MULL: begin |
| op_a_shift_d = op_a_ext << 1; |
| accum_window_d = {~(op_a_ext[32] & op_b_i[0]), op_a_ext[31:0] & {32 {op_b_i[0]}}}; |
| op_b_shift_d = op_b_ext >> 1; |
| md_state_d = (!data_ind_timing_i && ((op_b_ext >> 1) == 0) ? MD_LAST : MD_COMP); |
| end |
| MD_OP_MULH: begin |
| op_a_shift_d = op_a_ext; |
| accum_window_d = {1'b1, ~(op_a_ext[32] & op_b_i[0]), op_a_ext[31:1] & {31 {op_b_i[0]}}}; |
| op_b_shift_d = op_b_ext >> 1; |
| md_state_d = MD_COMP; |
| end |
| MD_OP_DIV: begin |
| accum_window_d = {33 {1'b1}}; |
| md_state_d = (!data_ind_timing_i && equal_to_zero_i ? MD_FINISH : MD_ABS_A); |
| div_by_zero_d = equal_to_zero_i; |
| end |
| MD_OP_REM: begin |
| accum_window_d = op_a_ext; |
| md_state_d = (!data_ind_timing_i && equal_to_zero_i ? MD_FINISH : MD_ABS_A); |
| end |
| default: |
| ; |
| endcase |
| multdiv_count_d = 5'd31; |
| end |
| MD_ABS_A: begin |
| op_a_shift_d = {33 {1'sb0}}; |
| op_numerator_d = (sign_a ? alu_adder_i : op_a_i); |
| md_state_d = MD_ABS_B; |
| end |
| MD_ABS_B: begin |
| accum_window_d = {32'h00000000, op_numerator_q[31]}; |
| op_b_shift_d = (sign_b ? {1'b0, alu_adder_i} : {1'b0, op_b_i}); |
| md_state_d = MD_COMP; |
| end |
| MD_COMP: begin |
| multdiv_count_d = multdiv_count_q - 5'h01; |
| case (operator_i) |
| MD_OP_MULL: begin |
| accum_window_d = res_adder_l; |
| op_a_shift_d = op_a_shift_q << 1; |
| op_b_shift_d = op_b_shift_q >> 1; |
| md_state_d = ((!data_ind_timing_i && (op_b_shift_d == 0)) || (multdiv_count_q == 5'd1) ? MD_LAST : MD_COMP); |
| end |
| MD_OP_MULH: begin |
| accum_window_d = res_adder_h; |
| op_a_shift_d = op_a_shift_q; |
| op_b_shift_d = op_b_shift_q >> 1; |
| md_state_d = (multdiv_count_q == 5'd1 ? MD_LAST : MD_COMP); |
| end |
| MD_OP_DIV, MD_OP_REM: begin |
| accum_window_d = {next_remainder[31:0], op_numerator_q[multdiv_count_d]}; |
| op_a_shift_d = next_quotient; |
| md_state_d = (multdiv_count_q == 5'd1 ? MD_LAST : MD_COMP); |
| end |
| default: |
| ; |
| endcase |
| end |
| MD_LAST: |
| case (operator_i) |
| MD_OP_MULL: begin |
| accum_window_d = res_adder_l; |
| md_state_d = MD_IDLE; |
| multdiv_hold = ~multdiv_ready_id_i; |
| end |
| MD_OP_MULH: begin |
| accum_window_d = res_adder_l; |
| md_state_d = MD_IDLE; |
| md_state_d = MD_IDLE; |
| multdiv_hold = ~multdiv_ready_id_i; |
| end |
| MD_OP_DIV: begin |
| accum_window_d = next_quotient; |
| md_state_d = MD_CHANGE_SIGN; |
| end |
| MD_OP_REM: begin |
| accum_window_d = {1'b0, next_remainder[31:0]}; |
| md_state_d = MD_CHANGE_SIGN; |
| end |
| default: |
| ; |
| endcase |
| MD_CHANGE_SIGN: begin |
| md_state_d = MD_FINISH; |
| case (operator_i) |
| MD_OP_DIV: accum_window_d = (div_change_sign ? {1'b0, alu_adder_i} : accum_window_q); |
| MD_OP_REM: accum_window_d = (rem_change_sign ? {1'b0, alu_adder_i} : accum_window_q); |
| default: |
| ; |
| endcase |
| end |
| MD_FINISH: begin |
| md_state_d = MD_IDLE; |
| multdiv_hold = ~multdiv_ready_id_i; |
| end |
| default: md_state_d = MD_IDLE; |
| endcase |
| end |
| assign multdiv_en = (mult_en_i | div_en_i) & ~multdiv_hold; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| multdiv_count_q <= 5'h00; |
| op_b_shift_q <= 33'h000000000; |
| op_a_shift_q <= 33'h000000000; |
| md_state_q <= MD_IDLE; |
| div_by_zero_q <= 1'b0; |
| end |
| else if (multdiv_en) begin |
| multdiv_count_q <= multdiv_count_d; |
| op_b_shift_q <= op_b_shift_d; |
| op_a_shift_q <= op_a_shift_d; |
| md_state_q <= md_state_d; |
| div_by_zero_q <= div_by_zero_d; |
| end |
| assign valid_o = (md_state_q == MD_FINISH) | ((md_state_q == MD_LAST) & ((operator_i == MD_OP_MULL) | (operator_i == MD_OP_MULH))); |
| assign multdiv_result_o = (div_en_i ? accum_window_q[31:0] : res_adder_l[31:0]); |
| endmodule |
| module brqrv_idu ( |
| clk_i, |
| rst_ni, |
| ctrl_busy_o, |
| illegal_insn_o, |
| instr_valid_i, |
| instr_rdata_i, |
| instr_rdata_alu_i, |
| instr_rdata_c_i, |
| instr_is_compressed_i, |
| instr_bp_taken_i, |
| instr_req_o, |
| instr_first_cycle_id_o, |
| instr_valid_clear_o, |
| id_in_ready_o, |
| icache_inval_o, |
| branch_decision_i, |
| pc_set_o, |
| pc_set_spec_o, |
| pc_mux_o, |
| nt_branch_mispredict_o, |
| exc_pc_mux_o, |
| exc_cause_o, |
| illegal_c_insn_i, |
| instr_fetch_err_i, |
| instr_fetch_err_plus2_i, |
| pc_id_i, |
| ex_valid_i, |
| lsu_resp_valid_i, |
| alu_operator_ex_o, |
| alu_operand_a_ex_o, |
| alu_operand_b_ex_o, |
| imd_val_we_ex_i, |
| imd_val_d_ex_i, |
| imd_val_q_ex_o, |
| bt_a_operand_o, |
| bt_b_operand_o, |
| mult_en_ex_o, |
| div_en_ex_o, |
| mult_sel_ex_o, |
| div_sel_ex_o, |
| multdiv_operator_ex_o, |
| multdiv_signed_mode_ex_o, |
| multdiv_operand_a_ex_o, |
| multdiv_operand_b_ex_o, |
| multdiv_ready_id_o, |
| csr_access_o, |
| csr_op_o, |
| csr_op_en_o, |
| csr_save_if_o, |
| csr_save_id_o, |
| csr_save_wb_o, |
| csr_restore_mret_id_o, |
| csr_restore_dret_id_o, |
| csr_save_cause_o, |
| csr_mtval_o, |
| priv_mode_i, |
| csr_mstatus_tw_i, |
| illegal_csr_insn_i, |
| data_ind_timing_i, |
| lsu_req_o, |
| lsu_we_o, |
| lsu_type_o, |
| lsu_sign_ext_o, |
| lsu_wdata_o, |
| lsu_req_done_i, |
| lsu_addr_incr_req_i, |
| lsu_addr_last_i, |
| csr_mstatus_mie_i, |
| irq_pending_i, |
| irqs_i, |
| irq_nm_i, |
| nmi_mode_o, |
| lsu_load_err_i, |
| lsu_store_err_i, |
| debug_mode_o, |
| debug_cause_o, |
| debug_csr_save_o, |
| debug_req_i, |
| debug_single_step_i, |
| debug_ebreakm_i, |
| debug_ebreaku_i, |
| trigger_match_i, |
| result_ex_i, |
| csr_rdata_i, |
| rf_raddr_a_o, |
| rf_rdata_a_i, |
| rf_raddr_b_o, |
| rf_rdata_b_i, |
| rf_ren_a_o, |
| rf_ren_b_o, |
| rf_waddr_id_o, |
| rf_wdata_id_o, |
| rf_we_id_o, |
| rf_rd_a_wb_match_o, |
| rf_rd_b_wb_match_o, |
| rf_waddr_wb_i, |
| rf_wdata_fwd_wb_i, |
| rf_write_wb_i, |
| en_wb_o, |
| instr_type_wb_o, |
| ready_wb_i, |
| outstanding_load_wb_i, |
| outstanding_store_wb_i, |
| perf_jump_o, |
| perf_branch_o, |
| perf_tbranch_o, |
| perf_dside_wait_o, |
| perf_mul_wait_o, |
| perf_div_wait_o, |
| instr_id_done_o, |
| instr_id_done_compressed_o |
| ); |
| parameter [0:0] RV32E = 0; |
| localparam integer brqrv_pkg_RV32MFast = 2; |
| parameter integer RV32M = brqrv_pkg_RV32MFast; |
| localparam integer brqrv_pkg_RV32BNone = 0; |
| parameter integer RV32B = brqrv_pkg_RV32BNone; |
| parameter [0:0] DataIndTiming = 1'b0; |
| parameter [0:0] BranchTargetALU = 0; |
| parameter [0:0] SpecBranch = 0; |
| parameter [0:0] WritebackStage = 0; |
| parameter [0:0] BranchPredictor = 0; |
| input wire clk_i; |
| input wire rst_ni; |
| output wire ctrl_busy_o; |
| output wire illegal_insn_o; |
| input wire instr_valid_i; |
| input wire [31:0] instr_rdata_i; |
| input wire [31:0] instr_rdata_alu_i; |
| input wire [15:0] instr_rdata_c_i; |
| input wire instr_is_compressed_i; |
| input wire instr_bp_taken_i; |
| output wire instr_req_o; |
| output wire instr_first_cycle_id_o; |
| output wire instr_valid_clear_o; |
| output wire id_in_ready_o; |
| output wire icache_inval_o; |
| input wire branch_decision_i; |
| output wire pc_set_o; |
| output wire pc_set_spec_o; |
| output wire [2:0] pc_mux_o; |
| output wire nt_branch_mispredict_o; |
| output wire [1:0] exc_pc_mux_o; |
| output wire [5:0] exc_cause_o; |
| input wire illegal_c_insn_i; |
| input wire instr_fetch_err_i; |
| input wire instr_fetch_err_plus2_i; |
| input wire [31:0] pc_id_i; |
| input wire ex_valid_i; |
| input wire lsu_resp_valid_i; |
| output wire [5:0] alu_operator_ex_o; |
| output wire [31:0] alu_operand_a_ex_o; |
| output wire [31:0] alu_operand_b_ex_o; |
| input wire [1:0] imd_val_we_ex_i; |
| input wire [67:0] imd_val_d_ex_i; |
| output wire [67:0] imd_val_q_ex_o; |
| output reg [31:0] bt_a_operand_o; |
| output reg [31:0] bt_b_operand_o; |
| output wire mult_en_ex_o; |
| output wire div_en_ex_o; |
| output wire mult_sel_ex_o; |
| output wire div_sel_ex_o; |
| output wire [1:0] multdiv_operator_ex_o; |
| output wire [1:0] multdiv_signed_mode_ex_o; |
| output wire [31:0] multdiv_operand_a_ex_o; |
| output wire [31:0] multdiv_operand_b_ex_o; |
| output wire multdiv_ready_id_o; |
| output wire csr_access_o; |
| output wire [1:0] csr_op_o; |
| output wire csr_op_en_o; |
| output wire csr_save_if_o; |
| output wire csr_save_id_o; |
| output wire csr_save_wb_o; |
| output wire csr_restore_mret_id_o; |
| output wire csr_restore_dret_id_o; |
| output wire csr_save_cause_o; |
| output wire [31:0] csr_mtval_o; |
| input wire [1:0] priv_mode_i; |
| input wire csr_mstatus_tw_i; |
| input wire illegal_csr_insn_i; |
| input wire data_ind_timing_i; |
| output wire lsu_req_o; |
| output wire lsu_we_o; |
| output wire [1:0] lsu_type_o; |
| output wire lsu_sign_ext_o; |
| output wire [31:0] lsu_wdata_o; |
| input wire lsu_req_done_i; |
| input wire lsu_addr_incr_req_i; |
| input wire [31:0] lsu_addr_last_i; |
| input wire csr_mstatus_mie_i; |
| input wire irq_pending_i; |
| input wire [17:0] irqs_i; |
| input wire irq_nm_i; |
| output wire nmi_mode_o; |
| input wire lsu_load_err_i; |
| input wire lsu_store_err_i; |
| output wire debug_mode_o; |
| output wire [2:0] debug_cause_o; |
| output wire debug_csr_save_o; |
| input wire debug_req_i; |
| input wire debug_single_step_i; |
| input wire debug_ebreakm_i; |
| input wire debug_ebreaku_i; |
| input wire trigger_match_i; |
| input wire [31:0] result_ex_i; |
| input wire [31:0] csr_rdata_i; |
| output wire [4:0] rf_raddr_a_o; |
| input wire [31:0] rf_rdata_a_i; |
| output wire [4:0] rf_raddr_b_o; |
| input wire [31:0] rf_rdata_b_i; |
| output wire rf_ren_a_o; |
| output wire rf_ren_b_o; |
| output wire [4:0] rf_waddr_id_o; |
| output reg [31:0] rf_wdata_id_o; |
| output wire rf_we_id_o; |
| output wire rf_rd_a_wb_match_o; |
| output wire rf_rd_b_wb_match_o; |
| input wire [4:0] rf_waddr_wb_i; |
| input wire [31:0] rf_wdata_fwd_wb_i; |
| input wire rf_write_wb_i; |
| output wire en_wb_o; |
| output wire [1:0] instr_type_wb_o; |
| input wire ready_wb_i; |
| input wire outstanding_load_wb_i; |
| input wire outstanding_store_wb_i; |
| output wire perf_jump_o; |
| output reg perf_branch_o; |
| output wire perf_tbranch_o; |
| output wire perf_dside_wait_o; |
| output wire perf_mul_wait_o; |
| output wire perf_div_wait_o; |
| output wire instr_id_done_o; |
| output wire instr_id_done_compressed_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| wire illegal_insn_dec; |
| wire ebrk_insn; |
| wire mret_insn_dec; |
| wire dret_insn_dec; |
| wire ecall_insn_dec; |
| wire wfi_insn_dec; |
| wire wb_exception; |
| wire branch_in_dec; |
| reg branch_spec; |
| wire branch_set_spec; |
| wire branch_set; |
| reg branch_set_d; |
| reg branch_not_set; |
| wire branch_taken; |
| wire jump_in_dec; |
| wire jump_set_dec; |
| reg jump_set; |
| wire instr_first_cycle; |
| wire instr_executing; |
| wire instr_done; |
| wire controller_run; |
| wire stall_ld_hz; |
| wire stall_mem; |
| reg stall_multdiv; |
| reg stall_branch; |
| reg stall_jump; |
| wire stall_id; |
| wire stall_wb; |
| wire flush_id; |
| wire multicycle_done; |
| wire [31:0] imm_i_type; |
| wire [31:0] imm_s_type; |
| wire [31:0] imm_b_type; |
| wire [31:0] imm_u_type; |
| wire [31:0] imm_j_type; |
| wire [31:0] zimm_rs1_type; |
| wire [31:0] imm_a; |
| reg [31:0] imm_b; |
| wire rf_wdata_sel; |
| wire rf_we_dec; |
| reg rf_we_raw; |
| wire rf_ren_a; |
| wire rf_ren_b; |
| assign rf_ren_a_o = rf_ren_a; |
| assign rf_ren_b_o = rf_ren_b; |
| wire [31:0] rf_rdata_a_fwd; |
| wire [31:0] rf_rdata_b_fwd; |
| wire [5:0] alu_operator; |
| wire [1:0] alu_op_a_mux_sel; |
| wire [1:0] alu_op_a_mux_sel_dec; |
| wire alu_op_b_mux_sel; |
| wire alu_op_b_mux_sel_dec; |
| wire alu_multicycle_dec; |
| reg stall_alu; |
| reg [67:0] imd_val_q; |
| wire [1:0] bt_a_mux_sel; |
| wire [2:0] bt_b_mux_sel; |
| wire imm_a_mux_sel; |
| wire [2:0] imm_b_mux_sel; |
| wire [2:0] imm_b_mux_sel_dec; |
| wire mult_en_id; |
| wire mult_en_dec; |
| wire div_en_id; |
| wire div_en_dec; |
| wire multdiv_en_dec; |
| wire [1:0] multdiv_operator; |
| wire [1:0] multdiv_signed_mode; |
| wire lsu_we; |
| wire [1:0] lsu_type; |
| wire lsu_sign_ext; |
| wire lsu_req; |
| wire lsu_req_dec; |
| wire data_req_allowed; |
| reg csr_pipe_flush; |
| reg [31:0] alu_operand_a; |
| wire [31:0] alu_operand_b; |
| assign alu_op_a_mux_sel = (lsu_addr_incr_req_i ? OP_A_FWD : alu_op_a_mux_sel_dec); |
| assign alu_op_b_mux_sel = (lsu_addr_incr_req_i ? OP_B_IMM : alu_op_b_mux_sel_dec); |
| assign imm_b_mux_sel = (lsu_addr_incr_req_i ? IMM_B_INCR_ADDR : imm_b_mux_sel_dec); |
| assign imm_a = (imm_a_mux_sel == IMM_A_Z ? zimm_rs1_type : {32 {1'sb0}}); |
| always @(*) begin : alu_operand_a_mux |
| case (alu_op_a_mux_sel) |
| OP_A_REG_A: alu_operand_a = rf_rdata_a_fwd; |
| OP_A_FWD: alu_operand_a = lsu_addr_last_i; |
| OP_A_CURRPC: alu_operand_a = pc_id_i; |
| OP_A_IMM: alu_operand_a = imm_a; |
| default: alu_operand_a = pc_id_i; |
| endcase |
| end |
| generate |
| if (BranchTargetALU) begin : g_btalu_muxes |
| always @(*) begin : bt_operand_a_mux |
| case (bt_a_mux_sel) |
| OP_A_REG_A: bt_a_operand_o = rf_rdata_a_fwd; |
| OP_A_CURRPC: bt_a_operand_o = pc_id_i; |
| default: bt_a_operand_o = pc_id_i; |
| endcase |
| end |
| always @(*) begin : bt_immediate_b_mux |
| case (bt_b_mux_sel) |
| IMM_B_I: bt_b_operand_o = imm_i_type; |
| IMM_B_B: bt_b_operand_o = imm_b_type; |
| IMM_B_J: bt_b_operand_o = imm_j_type; |
| IMM_B_INCR_PC: bt_b_operand_o = (instr_is_compressed_i ? 32'h00000002 : 32'h00000004); |
| default: bt_b_operand_o = (instr_is_compressed_i ? 32'h00000002 : 32'h00000004); |
| endcase |
| end |
| always @(*) begin : immediate_b_mux |
| case (imm_b_mux_sel) |
| IMM_B_I: imm_b = imm_i_type; |
| IMM_B_S: imm_b = imm_s_type; |
| IMM_B_U: imm_b = imm_u_type; |
| IMM_B_INCR_PC: imm_b = (instr_is_compressed_i ? 32'h00000002 : 32'h00000004); |
| IMM_B_INCR_ADDR: imm_b = 32'h00000004; |
| default: imm_b = 32'h00000004; |
| endcase |
| end |
| end |
| else begin : g_nobtalu |
| wire [1:0] unused_a_mux_sel; |
| wire [2:0] unused_b_mux_sel; |
| assign unused_a_mux_sel = bt_a_mux_sel; |
| assign unused_b_mux_sel = bt_b_mux_sel; |
| always @(*) bt_a_operand_o = {32 {1'sb0}}; |
| always @(*) bt_b_operand_o = {32 {1'sb0}}; |
| always @(*) begin : immediate_b_mux |
| case (imm_b_mux_sel) |
| IMM_B_I: imm_b = imm_i_type; |
| IMM_B_S: imm_b = imm_s_type; |
| IMM_B_B: imm_b = imm_b_type; |
| IMM_B_U: imm_b = imm_u_type; |
| IMM_B_J: imm_b = imm_j_type; |
| IMM_B_INCR_PC: imm_b = (instr_is_compressed_i ? 32'h00000002 : 32'h00000004); |
| IMM_B_INCR_ADDR: imm_b = 32'h00000004; |
| default: imm_b = 32'h00000004; |
| endcase |
| end |
| end |
| endgenerate |
| assign alu_operand_b = (alu_op_b_mux_sel == OP_B_IMM ? imm_b : rf_rdata_b_fwd); |
| generate |
| genvar i; |
| for (i = 0; i < 2; i = i + 1) begin : gen_intermediate_val_reg |
| always @(posedge clk_i or negedge rst_ni) begin : intermediate_val_reg |
| if (!rst_ni) |
| imd_val_q[(1 - i) * 34+:34] <= {34 {1'sb0}}; |
| else if (imd_val_we_ex_i[i]) |
| imd_val_q[(1 - i) * 34+:34] <= imd_val_d_ex_i[(1 - i) * 34+:34]; |
| end |
| end |
| endgenerate |
| assign imd_val_q_ex_o = imd_val_q; |
| assign rf_we_id_o = (rf_we_raw & instr_executing) & ~illegal_csr_insn_i; |
| always @(*) begin : rf_wdata_id_mux |
| case (rf_wdata_sel) |
| RF_WD_EX: rf_wdata_id_o = result_ex_i; |
| RF_WD_CSR: rf_wdata_id_o = csr_rdata_i; |
| default: rf_wdata_id_o = result_ex_i; |
| endcase |
| end |
| brqrv_idu_dec #( |
| .RV32E(RV32E), |
| .RV32M(RV32M), |
| .RV32B(RV32B), |
| .BranchTargetALU(BranchTargetALU) |
| ) decoder_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .illegal_insn_o(illegal_insn_dec), |
| .ebrk_insn_o(ebrk_insn), |
| .mret_insn_o(mret_insn_dec), |
| .dret_insn_o(dret_insn_dec), |
| .ecall_insn_o(ecall_insn_dec), |
| .wfi_insn_o(wfi_insn_dec), |
| .jump_set_o(jump_set_dec), |
| .branch_taken_i(branch_taken), |
| .icache_inval_o(icache_inval_o), |
| .instr_first_cycle_i(instr_first_cycle), |
| .instr_rdata_i(instr_rdata_i), |
| .instr_rdata_alu_i(instr_rdata_alu_i), |
| .illegal_c_insn_i(illegal_c_insn_i), |
| .imm_a_mux_sel_o(imm_a_mux_sel), |
| .imm_b_mux_sel_o(imm_b_mux_sel_dec), |
| .bt_a_mux_sel_o(bt_a_mux_sel), |
| .bt_b_mux_sel_o(bt_b_mux_sel), |
| .imm_i_type_o(imm_i_type), |
| .imm_s_type_o(imm_s_type), |
| .imm_b_type_o(imm_b_type), |
| .imm_u_type_o(imm_u_type), |
| .imm_j_type_o(imm_j_type), |
| .zimm_rs1_type_o(zimm_rs1_type), |
| .rf_wdata_sel_o(rf_wdata_sel), |
| .rf_we_o(rf_we_dec), |
| .rf_raddr_a_o(rf_raddr_a_o), |
| .rf_raddr_b_o(rf_raddr_b_o), |
| .rf_waddr_o(rf_waddr_id_o), |
| .rf_ren_a_o(rf_ren_a), |
| .rf_ren_b_o(rf_ren_b), |
| .alu_operator_o(alu_operator), |
| .alu_op_a_mux_sel_o(alu_op_a_mux_sel_dec), |
| .alu_op_b_mux_sel_o(alu_op_b_mux_sel_dec), |
| .alu_multicycle_o(alu_multicycle_dec), |
| .mult_en_o(mult_en_dec), |
| .div_en_o(div_en_dec), |
| .mult_sel_o(mult_sel_ex_o), |
| .div_sel_o(div_sel_ex_o), |
| .multdiv_operator_o(multdiv_operator), |
| .multdiv_signed_mode_o(multdiv_signed_mode), |
| .csr_access_o(csr_access_o), |
| .csr_op_o(csr_op_o), |
| .data_req_o(lsu_req_dec), |
| .data_we_o(lsu_we), |
| .data_type_o(lsu_type), |
| .data_sign_extension_o(lsu_sign_ext), |
| .jump_in_dec_o(jump_in_dec), |
| .branch_in_dec_o(branch_in_dec) |
| ); |
| function automatic [11:0] sv2v_cast_12; |
| input reg [11:0] inp; |
| sv2v_cast_12 = inp; |
| endfunction |
| always @(*) begin : csr_pipeline_flushes |
| csr_pipe_flush = 1'b0; |
| if ((csr_op_en_o == 1'b1) && ((csr_op_o == CSR_OP_WRITE) || (csr_op_o == CSR_OP_SET))) begin |
| if ((sv2v_cast_12(instr_rdata_i[31:20]) == CSR_MSTATUS) || (sv2v_cast_12(instr_rdata_i[31:20]) == CSR_MIE)) |
| csr_pipe_flush = 1'b1; |
| end |
| else if ((csr_op_en_o == 1'b1) && (csr_op_o != CSR_OP_READ)) |
| if ((((sv2v_cast_12(instr_rdata_i[31:20]) == CSR_DCSR) || (sv2v_cast_12(instr_rdata_i[31:20]) == CSR_DPC)) || (sv2v_cast_12(instr_rdata_i[31:20]) == CSR_DSCRATCH0)) || (sv2v_cast_12(instr_rdata_i[31:20]) == CSR_DSCRATCH1)) |
| csr_pipe_flush = 1'b1; |
| end |
| assign illegal_insn_o = instr_valid_i & (illegal_insn_dec | illegal_csr_insn_i); |
| brqrv_idu_controller #( |
| .WritebackStage(WritebackStage), |
| .BranchPredictor(BranchPredictor) |
| ) controller_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .ctrl_busy_o(ctrl_busy_o), |
| .illegal_insn_i(illegal_insn_o), |
| .ecall_insn_i(ecall_insn_dec), |
| .mret_insn_i(mret_insn_dec), |
| .dret_insn_i(dret_insn_dec), |
| .wfi_insn_i(wfi_insn_dec), |
| .ebrk_insn_i(ebrk_insn), |
| .csr_pipe_flush_i(csr_pipe_flush), |
| .instr_valid_i(instr_valid_i), |
| .instr_i(instr_rdata_i), |
| .instr_compressed_i(instr_rdata_c_i), |
| .instr_is_compressed_i(instr_is_compressed_i), |
| .instr_bp_taken_i(instr_bp_taken_i), |
| .instr_fetch_err_i(instr_fetch_err_i), |
| .instr_fetch_err_plus2_i(instr_fetch_err_plus2_i), |
| .pc_id_i(pc_id_i), |
| .instr_valid_clear_o(instr_valid_clear_o), |
| .id_in_ready_o(id_in_ready_o), |
| .controller_run_o(controller_run), |
| .instr_req_o(instr_req_o), |
| .pc_set_o(pc_set_o), |
| .pc_set_spec_o(pc_set_spec_o), |
| .pc_mux_o(pc_mux_o), |
| .nt_branch_mispredict_o(nt_branch_mispredict_o), |
| .exc_pc_mux_o(exc_pc_mux_o), |
| .exc_cause_o(exc_cause_o), |
| .lsu_addr_last_i(lsu_addr_last_i), |
| .load_err_i(lsu_load_err_i), |
| .store_err_i(lsu_store_err_i), |
| .wb_exception_o(wb_exception), |
| .branch_set_i(branch_set), |
| .branch_set_spec_i(branch_set_spec), |
| .branch_not_set_i(branch_not_set), |
| .jump_set_i(jump_set), |
| .csr_mstatus_mie_i(csr_mstatus_mie_i), |
| .irq_pending_i(irq_pending_i), |
| .irqs_i(irqs_i), |
| .irq_nm_i(irq_nm_i), |
| .nmi_mode_o(nmi_mode_o), |
| .csr_save_if_o(csr_save_if_o), |
| .csr_save_id_o(csr_save_id_o), |
| .csr_save_wb_o(csr_save_wb_o), |
| .csr_restore_mret_id_o(csr_restore_mret_id_o), |
| .csr_restore_dret_id_o(csr_restore_dret_id_o), |
| .csr_save_cause_o(csr_save_cause_o), |
| .csr_mtval_o(csr_mtval_o), |
| .priv_mode_i(priv_mode_i), |
| .csr_mstatus_tw_i(csr_mstatus_tw_i), |
| .debug_mode_o(debug_mode_o), |
| .debug_cause_o(debug_cause_o), |
| .debug_csr_save_o(debug_csr_save_o), |
| .debug_req_i(debug_req_i), |
| .debug_single_step_i(debug_single_step_i), |
| .debug_ebreakm_i(debug_ebreakm_i), |
| .debug_ebreaku_i(debug_ebreaku_i), |
| .trigger_match_i(trigger_match_i), |
| .stall_id_i(stall_id), |
| .stall_wb_i(stall_wb), |
| .flush_id_o(flush_id), |
| .ready_wb_i(ready_wb_i), |
| .perf_jump_o(perf_jump_o), |
| .perf_tbranch_o(perf_tbranch_o) |
| ); |
| assign multdiv_en_dec = mult_en_dec | div_en_dec; |
| assign lsu_req = (instr_executing ? data_req_allowed & lsu_req_dec : 1'b0); |
| assign mult_en_id = (instr_executing ? mult_en_dec : 1'b0); |
| assign div_en_id = (instr_executing ? div_en_dec : 1'b0); |
| assign lsu_req_o = lsu_req; |
| assign lsu_we_o = lsu_we; |
| assign lsu_type_o = lsu_type; |
| assign lsu_sign_ext_o = lsu_sign_ext; |
| assign lsu_wdata_o = rf_rdata_b_fwd; |
| assign csr_op_en_o = (csr_access_o & instr_executing) & instr_id_done_o; |
| assign alu_operator_ex_o = alu_operator; |
| assign alu_operand_a_ex_o = alu_operand_a; |
| assign alu_operand_b_ex_o = alu_operand_b; |
| assign mult_en_ex_o = mult_en_id; |
| assign div_en_ex_o = div_en_id; |
| assign multdiv_operator_ex_o = multdiv_operator; |
| assign multdiv_signed_mode_ex_o = multdiv_signed_mode; |
| assign multdiv_operand_a_ex_o = rf_rdata_a_fwd; |
| assign multdiv_operand_b_ex_o = rf_rdata_b_fwd; |
| generate |
| if (BranchTargetALU && !DataIndTiming) begin : g_branch_set_direct |
| assign branch_set = branch_set_d; |
| assign branch_set_spec = branch_spec; |
| end |
| else begin : g_branch_set_flop |
| reg branch_set_q; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| branch_set_q <= 1'b0; |
| else |
| branch_set_q <= branch_set_d; |
| assign branch_set = (BranchTargetALU && !data_ind_timing_i ? branch_set_d : branch_set_q); |
| assign branch_set_spec = (BranchTargetALU && !data_ind_timing_i ? branch_spec : branch_set_q); |
| end |
| endgenerate |
| generate |
| if (DataIndTiming) begin : g_sec_branch_taken |
| reg branch_taken_q; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| branch_taken_q <= 1'b0; |
| else |
| branch_taken_q <= branch_decision_i; |
| assign branch_taken = ~data_ind_timing_i | branch_taken_q; |
| end |
| else begin : g_nosec_branch_taken |
| assign branch_taken = 1'b1; |
| end |
| endgenerate |
| reg id_fsm_q; |
| reg id_fsm_d; |
| localparam [0:0] FIRST_CYCLE = 0; |
| always @(posedge clk_i or negedge rst_ni) begin : id_pipeline_reg |
| if (!rst_ni) |
| id_fsm_q <= FIRST_CYCLE; |
| else |
| id_fsm_q <= id_fsm_d; |
| end |
| localparam [0:0] MULTI_CYCLE = 1; |
| always @(*) begin |
| id_fsm_d = id_fsm_q; |
| rf_we_raw = rf_we_dec; |
| stall_multdiv = 1'b0; |
| stall_jump = 1'b0; |
| stall_branch = 1'b0; |
| stall_alu = 1'b0; |
| branch_set_d = 1'b0; |
| branch_spec = 1'b0; |
| branch_not_set = 1'b0; |
| jump_set = 1'b0; |
| perf_branch_o = 1'b0; |
| if (instr_executing) |
| case (id_fsm_q) |
| FIRST_CYCLE: |
| case (1'b1) |
| lsu_req_dec: |
| if (!WritebackStage) |
| id_fsm_d = MULTI_CYCLE; |
| else if (~lsu_req_done_i) |
| id_fsm_d = MULTI_CYCLE; |
| multdiv_en_dec: |
| if (~ex_valid_i) begin |
| id_fsm_d = MULTI_CYCLE; |
| rf_we_raw = 1'b0; |
| stall_multdiv = 1'b1; |
| end |
| branch_in_dec: begin |
| id_fsm_d = (data_ind_timing_i || (!BranchTargetALU && branch_decision_i) ? MULTI_CYCLE : FIRST_CYCLE); |
| stall_branch = (~BranchTargetALU & branch_decision_i) | data_ind_timing_i; |
| branch_set_d = branch_decision_i | data_ind_timing_i; |
| if (BranchPredictor) |
| branch_not_set = ~branch_decision_i; |
| branch_spec = (SpecBranch ? 1'b1 : branch_decision_i); |
| perf_branch_o = 1'b1; |
| end |
| jump_in_dec: begin |
| id_fsm_d = (BranchTargetALU ? FIRST_CYCLE : MULTI_CYCLE); |
| stall_jump = ~BranchTargetALU; |
| jump_set = jump_set_dec; |
| end |
| alu_multicycle_dec: begin |
| stall_alu = 1'b1; |
| id_fsm_d = MULTI_CYCLE; |
| rf_we_raw = 1'b0; |
| end |
| default: id_fsm_d = FIRST_CYCLE; |
| endcase |
| MULTI_CYCLE: begin |
| if (multdiv_en_dec) |
| rf_we_raw = rf_we_dec & ex_valid_i; |
| if (multicycle_done & ready_wb_i) |
| id_fsm_d = FIRST_CYCLE; |
| else begin |
| stall_multdiv = multdiv_en_dec; |
| stall_branch = branch_in_dec; |
| stall_jump = jump_in_dec; |
| end |
| end |
| default: id_fsm_d = FIRST_CYCLE; |
| endcase |
| end |
| assign multdiv_ready_id_o = ready_wb_i; |
| assign stall_id = ((((stall_ld_hz | stall_mem) | stall_multdiv) | stall_jump) | stall_branch) | stall_alu; |
| assign instr_done = (~stall_id & ~flush_id) & instr_executing; |
| assign instr_first_cycle = instr_valid_i & (id_fsm_q == FIRST_CYCLE); |
| assign instr_first_cycle_id_o = instr_first_cycle; |
| generate |
| if (WritebackStage) begin : gen_stall_mem |
| wire rf_rd_a_wb_match; |
| wire rf_rd_b_wb_match; |
| wire rf_rd_a_hz; |
| wire rf_rd_b_hz; |
| wire outstanding_memory_access; |
| wire instr_kill; |
| assign multicycle_done = (lsu_req_dec ? ~stall_mem : ex_valid_i); |
| assign outstanding_memory_access = (outstanding_load_wb_i | outstanding_store_wb_i) & ~lsu_resp_valid_i; |
| assign data_req_allowed = ~outstanding_memory_access; |
| assign instr_kill = (instr_fetch_err_i | wb_exception) | ~controller_run; |
| assign instr_executing = ((instr_valid_i & ~instr_kill) & ~stall_ld_hz) & ~outstanding_memory_access; |
| assign stall_mem = instr_valid_i & (outstanding_memory_access | (lsu_req_dec & ~lsu_req_done_i)); |
| assign rf_rd_a_wb_match = (rf_waddr_wb_i == rf_raddr_a_o) & |rf_raddr_a_o; |
| assign rf_rd_b_wb_match = (rf_waddr_wb_i == rf_raddr_b_o) & |rf_raddr_b_o; |
| assign rf_rd_a_wb_match_o = rf_rd_a_wb_match; |
| assign rf_rd_b_wb_match_o = rf_rd_b_wb_match; |
| assign rf_rd_a_hz = rf_rd_a_wb_match & rf_ren_a; |
| assign rf_rd_b_hz = rf_rd_b_wb_match & rf_ren_b; |
| assign rf_rdata_a_fwd = (rf_rd_a_wb_match & rf_write_wb_i ? rf_wdata_fwd_wb_i : rf_rdata_a_i); |
| assign rf_rdata_b_fwd = (rf_rd_b_wb_match & rf_write_wb_i ? rf_wdata_fwd_wb_i : rf_rdata_b_i); |
| assign stall_ld_hz = outstanding_load_wb_i & (rf_rd_a_hz | rf_rd_b_hz); |
| assign instr_type_wb_o = (~lsu_req_dec ? WB_INSTR_OTHER : (lsu_we ? WB_INSTR_STORE : WB_INSTR_LOAD)); |
| assign en_wb_o = instr_done; |
| assign instr_id_done_o = en_wb_o & ready_wb_i; |
| assign stall_wb = en_wb_o & ~ready_wb_i; |
| assign perf_dside_wait_o = (instr_valid_i & ~instr_kill) & (outstanding_memory_access | stall_ld_hz); |
| end |
| else begin : gen_no_stall_mem |
| assign multicycle_done = (lsu_req_dec ? lsu_resp_valid_i : ex_valid_i); |
| assign data_req_allowed = instr_first_cycle; |
| assign stall_mem = instr_valid_i & (lsu_req_dec & (~lsu_resp_valid_i | instr_first_cycle)); |
| assign stall_ld_hz = 1'b0; |
| assign instr_executing = (instr_valid_i & ~instr_fetch_err_i) & controller_run; |
| assign rf_rdata_a_fwd = rf_rdata_a_i; |
| assign rf_rdata_b_fwd = rf_rdata_b_i; |
| assign rf_rd_a_wb_match_o = 1'b0; |
| assign rf_rd_b_wb_match_o = 1'b0; |
| wire unused_data_req_done_ex; |
| wire unused_lsu_load; |
| wire [4:0] unused_rf_waddr_wb; |
| wire unused_rf_write_wb; |
| wire unused_outstanding_load_wb; |
| wire unused_outstanding_store_wb; |
| wire unused_wb_exception; |
| wire [31:0] unused_rf_wdata_fwd_wb; |
| assign unused_data_req_done_ex = lsu_req_done_i; |
| assign unused_rf_waddr_wb = rf_waddr_wb_i; |
| assign unused_rf_write_wb = rf_write_wb_i; |
| assign unused_outstanding_load_wb = outstanding_load_wb_i; |
| assign unused_outstanding_store_wb = outstanding_store_wb_i; |
| assign unused_wb_exception = wb_exception; |
| assign unused_rf_wdata_fwd_wb = rf_wdata_fwd_wb_i; |
| assign instr_type_wb_o = WB_INSTR_OTHER; |
| assign stall_wb = 1'b0; |
| assign perf_dside_wait_o = (instr_executing & lsu_req_dec) & ~lsu_resp_valid_i; |
| assign en_wb_o = 1'b0; |
| assign instr_id_done_o = instr_done; |
| end |
| endgenerate |
| assign perf_mul_wait_o = stall_multdiv & mult_en_dec; |
| assign perf_div_wait_o = stall_multdiv & div_en_dec; |
| assign instr_id_done_compressed_o = instr_id_done_o & instr_is_compressed_i; |
| endmodule |
| module brqrv_idu_controller ( |
| clk_i, |
| rst_ni, |
| ctrl_busy_o, |
| illegal_insn_i, |
| ecall_insn_i, |
| mret_insn_i, |
| dret_insn_i, |
| wfi_insn_i, |
| ebrk_insn_i, |
| csr_pipe_flush_i, |
| instr_valid_i, |
| instr_i, |
| instr_compressed_i, |
| instr_is_compressed_i, |
| instr_bp_taken_i, |
| instr_fetch_err_i, |
| instr_fetch_err_plus2_i, |
| pc_id_i, |
| instr_valid_clear_o, |
| id_in_ready_o, |
| controller_run_o, |
| instr_req_o, |
| pc_set_o, |
| pc_set_spec_o, |
| pc_mux_o, |
| nt_branch_mispredict_o, |
| exc_pc_mux_o, |
| exc_cause_o, |
| lsu_addr_last_i, |
| load_err_i, |
| store_err_i, |
| wb_exception_o, |
| branch_set_i, |
| branch_set_spec_i, |
| branch_not_set_i, |
| jump_set_i, |
| csr_mstatus_mie_i, |
| irq_pending_i, |
| irqs_i, |
| irq_nm_i, |
| nmi_mode_o, |
| debug_req_i, |
| debug_cause_o, |
| debug_csr_save_o, |
| debug_mode_o, |
| debug_single_step_i, |
| debug_ebreakm_i, |
| debug_ebreaku_i, |
| trigger_match_i, |
| csr_save_if_o, |
| csr_save_id_o, |
| csr_save_wb_o, |
| csr_restore_mret_id_o, |
| csr_restore_dret_id_o, |
| csr_save_cause_o, |
| csr_mtval_o, |
| priv_mode_i, |
| csr_mstatus_tw_i, |
| stall_id_i, |
| stall_wb_i, |
| flush_id_o, |
| ready_wb_i, |
| perf_jump_o, |
| perf_tbranch_o |
| ); |
| parameter [0:0] WritebackStage = 0; |
| parameter [0:0] BranchPredictor = 0; |
| input wire clk_i; |
| input wire rst_ni; |
| output reg ctrl_busy_o; |
| input wire illegal_insn_i; |
| input wire ecall_insn_i; |
| input wire mret_insn_i; |
| input wire dret_insn_i; |
| input wire wfi_insn_i; |
| input wire ebrk_insn_i; |
| input wire csr_pipe_flush_i; |
| input wire instr_valid_i; |
| input wire [31:0] instr_i; |
| input wire [15:0] instr_compressed_i; |
| input wire instr_is_compressed_i; |
| input wire instr_bp_taken_i; |
| input wire instr_fetch_err_i; |
| input wire instr_fetch_err_plus2_i; |
| input wire [31:0] pc_id_i; |
| output wire instr_valid_clear_o; |
| output wire id_in_ready_o; |
| output reg controller_run_o; |
| output reg instr_req_o; |
| output reg pc_set_o; |
| output reg pc_set_spec_o; |
| output reg [2:0] pc_mux_o; |
| output reg nt_branch_mispredict_o; |
| output reg [1:0] exc_pc_mux_o; |
| output reg [5:0] exc_cause_o; |
| input wire [31:0] lsu_addr_last_i; |
| input wire load_err_i; |
| input wire store_err_i; |
| output wire wb_exception_o; |
| input wire branch_set_i; |
| input wire branch_set_spec_i; |
| input wire branch_not_set_i; |
| input wire jump_set_i; |
| input wire csr_mstatus_mie_i; |
| input wire irq_pending_i; |
| input wire [17:0] irqs_i; |
| input wire irq_nm_i; |
| output wire nmi_mode_o; |
| input wire debug_req_i; |
| output reg [2:0] debug_cause_o; |
| output reg debug_csr_save_o; |
| output wire debug_mode_o; |
| input wire debug_single_step_i; |
| input wire debug_ebreakm_i; |
| input wire debug_ebreaku_i; |
| input wire trigger_match_i; |
| output reg csr_save_if_o; |
| output reg csr_save_id_o; |
| output reg csr_save_wb_o; |
| output reg csr_restore_mret_id_o; |
| output reg csr_restore_dret_id_o; |
| output reg csr_save_cause_o; |
| output reg [31:0] csr_mtval_o; |
| input wire [1:0] priv_mode_i; |
| input wire csr_mstatus_tw_i; |
| input wire stall_id_i; |
| input wire stall_wb_i; |
| output wire flush_id_o; |
| input wire ready_wb_i; |
| output reg perf_jump_o; |
| output reg perf_tbranch_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| reg [3:0] ctrl_fsm_cs; |
| reg [3:0] ctrl_fsm_ns; |
| reg nmi_mode_q; |
| reg nmi_mode_d; |
| reg debug_mode_q; |
| reg debug_mode_d; |
| reg load_err_q; |
| wire load_err_d; |
| reg store_err_q; |
| wire store_err_d; |
| reg exc_req_q; |
| wire exc_req_d; |
| reg illegal_insn_q; |
| wire illegal_insn_d; |
| reg instr_fetch_err_prio; |
| reg illegal_insn_prio; |
| reg ecall_insn_prio; |
| reg ebrk_insn_prio; |
| reg store_err_prio; |
| reg load_err_prio; |
| wire stall; |
| reg halt_if; |
| reg retain_id; |
| reg flush_id; |
| wire illegal_dret; |
| wire illegal_umode; |
| wire exc_req_lsu; |
| wire special_req_all; |
| wire special_req_branch; |
| wire enter_debug_mode; |
| wire ebreak_into_debug; |
| wire handle_irq; |
| reg [3:0] mfip_id; |
| wire unused_irq_timer; |
| wire ecall_insn; |
| wire mret_insn; |
| wire dret_insn; |
| wire wfi_insn; |
| wire ebrk_insn; |
| wire csr_pipe_flush; |
| wire instr_fetch_err; |
| localparam [3:0] DECODE = 5; |
| /*always @(negedge clk_i) |
| if ((((ctrl_fsm_cs == DECODE) && instr_valid_i) && !instr_fetch_err_i) && illegal_insn_d) |
| $display("%t: Illegal instruction (hart %0x) at PC 0x%h: 0x%h", $time, brqrv_core.hart_id_i, brqrv_idu.pc_id_i, brqrv_idu.instr_rdata_i); |
| */ |
| assign load_err_d = load_err_i; |
| assign store_err_d = store_err_i; |
| assign ecall_insn = ecall_insn_i & instr_valid_i; |
| assign mret_insn = mret_insn_i & instr_valid_i; |
| assign dret_insn = dret_insn_i & instr_valid_i; |
| assign wfi_insn = wfi_insn_i & instr_valid_i; |
| assign ebrk_insn = ebrk_insn_i & instr_valid_i; |
| assign csr_pipe_flush = csr_pipe_flush_i & instr_valid_i; |
| assign instr_fetch_err = instr_fetch_err_i & instr_valid_i; |
| assign illegal_dret = dret_insn & ~debug_mode_q; |
| assign illegal_umode = (priv_mode_i != PRIV_LVL_M) & (mret_insn | (csr_mstatus_tw_i & wfi_insn)); |
| localparam [3:0] FLUSH = 6; |
| assign illegal_insn_d = ((illegal_insn_i | illegal_dret) | illegal_umode) & (ctrl_fsm_cs != FLUSH); |
| assign exc_req_d = (((ecall_insn | ebrk_insn) | illegal_insn_d) | instr_fetch_err) & (ctrl_fsm_cs != FLUSH); |
| assign exc_req_lsu = store_err_i | load_err_i; |
| assign special_req_all = ((((mret_insn | dret_insn) | wfi_insn) | csr_pipe_flush) | exc_req_d) | exc_req_lsu; |
| assign special_req_branch = instr_fetch_err & (ctrl_fsm_cs != FLUSH); |
| generate |
| if (WritebackStage) begin : g_wb_exceptions |
| always @(*) begin |
| instr_fetch_err_prio = 0; |
| illegal_insn_prio = 0; |
| ecall_insn_prio = 0; |
| ebrk_insn_prio = 0; |
| store_err_prio = 0; |
| load_err_prio = 0; |
| if (store_err_q) |
| store_err_prio = 1'b1; |
| else if (load_err_q) |
| load_err_prio = 1'b1; |
| else if (instr_fetch_err) |
| instr_fetch_err_prio = 1'b1; |
| else if (illegal_insn_q) |
| illegal_insn_prio = 1'b1; |
| else if (ecall_insn) |
| ecall_insn_prio = 1'b1; |
| else if (ebrk_insn) |
| ebrk_insn_prio = 1'b1; |
| end |
| assign wb_exception_o = ((load_err_q | store_err_q) | load_err_i) | store_err_i; |
| end |
| else begin : g_no_wb_exceptions |
| always @(*) begin |
| instr_fetch_err_prio = 0; |
| illegal_insn_prio = 0; |
| ecall_insn_prio = 0; |
| ebrk_insn_prio = 0; |
| store_err_prio = 0; |
| load_err_prio = 0; |
| if (instr_fetch_err) |
| instr_fetch_err_prio = 1'b1; |
| else if (illegal_insn_q) |
| illegal_insn_prio = 1'b1; |
| else if (ecall_insn) |
| ecall_insn_prio = 1'b1; |
| else if (ebrk_insn) |
| ebrk_insn_prio = 1'b1; |
| else if (store_err_q) |
| store_err_prio = 1'b1; |
| else if (load_err_q) |
| load_err_prio = 1'b1; |
| end |
| assign wb_exception_o = 1'b0; |
| end |
| endgenerate |
| assign enter_debug_mode = ((debug_req_i | (debug_single_step_i & instr_valid_i)) | trigger_match_i) & ~debug_mode_q; |
| assign ebreak_into_debug = (priv_mode_i == PRIV_LVL_M ? debug_ebreakm_i : (priv_mode_i == PRIV_LVL_U ? debug_ebreaku_i : 1'b0)); |
| assign handle_irq = (~debug_mode_q & ~nmi_mode_q) & (irq_nm_i | (irq_pending_i & csr_mstatus_mie_i)); |
| always @(*) begin : gen_mfip_id |
| if (irqs_i[14]) |
| mfip_id = 4'd14; |
| else if (irqs_i[13]) |
| mfip_id = 4'd13; |
| else if (irqs_i[12]) |
| mfip_id = 4'd12; |
| else if (irqs_i[11]) |
| mfip_id = 4'd11; |
| else if (irqs_i[10]) |
| mfip_id = 4'd10; |
| else if (irqs_i[9]) |
| mfip_id = 4'd9; |
| else if (irqs_i[8]) |
| mfip_id = 4'd8; |
| else if (irqs_i[7]) |
| mfip_id = 4'd7; |
| else if (irqs_i[6]) |
| mfip_id = 4'd6; |
| else if (irqs_i[5]) |
| mfip_id = 4'd5; |
| else if (irqs_i[4]) |
| mfip_id = 4'd4; |
| else if (irqs_i[3]) |
| mfip_id = 4'd3; |
| else if (irqs_i[2]) |
| mfip_id = 4'd2; |
| else if (irqs_i[1]) |
| mfip_id = 4'd1; |
| else |
| mfip_id = 4'd0; |
| end |
| assign unused_irq_timer = irqs_i[16]; |
| function automatic [5:0] sv2v_cast_6; |
| input reg [5:0] inp; |
| sv2v_cast_6 = inp; |
| endfunction |
| localparam [3:0] BOOT_SET = 1; |
| localparam [3:0] DBG_TAKEN_ID = 9; |
| localparam [3:0] DBG_TAKEN_IF = 8; |
| localparam [3:0] FIRST_FETCH = 4; |
| localparam [3:0] IRQ_TAKEN = 7; |
| localparam [3:0] RESET = 0; |
| localparam [3:0] SLEEP = 3; |
| localparam [3:0] WAIT_SLEEP = 2; |
| always @(*) begin |
| instr_req_o = 1'b1; |
| csr_save_if_o = 1'b0; |
| csr_save_id_o = 1'b0; |
| csr_save_wb_o = 1'b0; |
| csr_restore_mret_id_o = 1'b0; |
| csr_restore_dret_id_o = 1'b0; |
| csr_save_cause_o = 1'b0; |
| csr_mtval_o = {32 {1'sb0}}; |
| pc_mux_o = PC_BOOT; |
| pc_set_o = 1'b0; |
| pc_set_spec_o = 1'b0; |
| nt_branch_mispredict_o = 1'b0; |
| exc_pc_mux_o = EXC_PC_IRQ; |
| exc_cause_o = EXC_CAUSE_INSN_ADDR_MISA; |
| ctrl_fsm_ns = ctrl_fsm_cs; |
| ctrl_busy_o = 1'b1; |
| halt_if = 1'b0; |
| retain_id = 1'b0; |
| flush_id = 1'b0; |
| debug_csr_save_o = 1'b0; |
| debug_cause_o = DBG_CAUSE_EBREAK; |
| debug_mode_d = debug_mode_q; |
| nmi_mode_d = nmi_mode_q; |
| perf_tbranch_o = 1'b0; |
| perf_jump_o = 1'b0; |
| controller_run_o = 1'b0; |
| case (ctrl_fsm_cs) |
| RESET: begin |
| instr_req_o = 1'b0; |
| pc_mux_o = PC_BOOT; |
| pc_set_o = 1'b1; |
| pc_set_spec_o = 1'b1; |
| ctrl_fsm_ns = BOOT_SET; |
| end |
| BOOT_SET: begin |
| instr_req_o = 1'b1; |
| pc_mux_o = PC_BOOT; |
| pc_set_o = 1'b1; |
| pc_set_spec_o = 1'b1; |
| ctrl_fsm_ns = FIRST_FETCH; |
| end |
| WAIT_SLEEP: begin |
| ctrl_busy_o = 1'b0; |
| instr_req_o = 1'b0; |
| halt_if = 1'b1; |
| flush_id = 1'b1; |
| ctrl_fsm_ns = SLEEP; |
| end |
| SLEEP: begin |
| instr_req_o = 1'b0; |
| halt_if = 1'b1; |
| flush_id = 1'b1; |
| if ((((irq_nm_i || irq_pending_i) || debug_req_i) || debug_mode_q) || debug_single_step_i) |
| ctrl_fsm_ns = FIRST_FETCH; |
| else |
| ctrl_busy_o = 1'b0; |
| end |
| FIRST_FETCH: begin |
| if (id_in_ready_o) |
| ctrl_fsm_ns = DECODE; |
| if (handle_irq) begin |
| ctrl_fsm_ns = IRQ_TAKEN; |
| halt_if = 1'b1; |
| end |
| if (enter_debug_mode) begin |
| ctrl_fsm_ns = DBG_TAKEN_IF; |
| halt_if = 1'b1; |
| end |
| end |
| DECODE: begin |
| controller_run_o = 1'b1; |
| pc_mux_o = PC_JUMP; |
| if (special_req_all) begin |
| retain_id = 1'b1; |
| if (ready_wb_i | wb_exception_o) |
| ctrl_fsm_ns = FLUSH; |
| end |
| if (!special_req_branch) begin |
| if (branch_set_i || jump_set_i) begin |
| pc_set_o = (BranchPredictor ? ~instr_bp_taken_i : 1'b1); |
| perf_tbranch_o = branch_set_i; |
| perf_jump_o = jump_set_i; |
| end |
| if (BranchPredictor) |
| if (instr_bp_taken_i & branch_not_set_i) |
| nt_branch_mispredict_o = 1'b1; |
| end |
| if ((branch_set_spec_i || jump_set_i) && !special_req_branch) |
| pc_set_spec_o = (BranchPredictor ? ~instr_bp_taken_i : 1'b1); |
| if ((enter_debug_mode || handle_irq) && stall) |
| halt_if = 1'b1; |
| if (!stall && !special_req_all) |
| if (enter_debug_mode) begin |
| ctrl_fsm_ns = DBG_TAKEN_IF; |
| halt_if = 1'b1; |
| end |
| else if (handle_irq) begin |
| ctrl_fsm_ns = IRQ_TAKEN; |
| halt_if = 1'b1; |
| end |
| end |
| IRQ_TAKEN: begin |
| pc_mux_o = PC_EXC; |
| exc_pc_mux_o = EXC_PC_IRQ; |
| if (handle_irq) begin |
| pc_set_o = 1'b1; |
| pc_set_spec_o = 1'b1; |
| csr_save_if_o = 1'b1; |
| csr_save_cause_o = 1'b1; |
| if (irq_nm_i && !nmi_mode_q) begin |
| exc_cause_o = EXC_CAUSE_IRQ_NM; |
| nmi_mode_d = 1'b1; |
| end |
| else if (irqs_i[14-:15] != 15'b000000000000000) |
| exc_cause_o = sv2v_cast_6({2'b11, mfip_id}); |
| else if (irqs_i[15]) |
| exc_cause_o = EXC_CAUSE_IRQ_EXTERNAL_M; |
| else if (irqs_i[17]) |
| exc_cause_o = EXC_CAUSE_IRQ_SOFTWARE_M; |
| else |
| exc_cause_o = EXC_CAUSE_IRQ_TIMER_M; |
| end |
| ctrl_fsm_ns = DECODE; |
| end |
| DBG_TAKEN_IF: begin |
| pc_mux_o = PC_EXC; |
| exc_pc_mux_o = EXC_PC_DBD; |
| if ((debug_single_step_i || debug_req_i) || trigger_match_i) begin |
| flush_id = 1'b1; |
| pc_set_o = 1'b1; |
| pc_set_spec_o = 1'b1; |
| csr_save_if_o = 1'b1; |
| debug_csr_save_o = 1'b1; |
| csr_save_cause_o = 1'b1; |
| if (trigger_match_i) |
| debug_cause_o = DBG_CAUSE_TRIGGER; |
| else if (debug_single_step_i) |
| debug_cause_o = DBG_CAUSE_STEP; |
| else |
| debug_cause_o = DBG_CAUSE_HALTREQ; |
| debug_mode_d = 1'b1; |
| end |
| ctrl_fsm_ns = DECODE; |
| end |
| DBG_TAKEN_ID: begin |
| flush_id = 1'b1; |
| pc_mux_o = PC_EXC; |
| pc_set_o = 1'b1; |
| pc_set_spec_o = 1'b1; |
| exc_pc_mux_o = EXC_PC_DBD; |
| if (ebreak_into_debug && !debug_mode_q) begin |
| csr_save_cause_o = 1'b1; |
| csr_save_id_o = 1'b1; |
| debug_csr_save_o = 1'b1; |
| debug_cause_o = DBG_CAUSE_EBREAK; |
| end |
| debug_mode_d = 1'b1; |
| ctrl_fsm_ns = DECODE; |
| end |
| FLUSH: begin |
| halt_if = 1'b1; |
| flush_id = 1'b1; |
| ctrl_fsm_ns = DECODE; |
| if ((exc_req_q || store_err_q) || load_err_q) begin |
| pc_set_o = 1'b1; |
| pc_set_spec_o = 1'b1; |
| pc_mux_o = PC_EXC; |
| exc_pc_mux_o = (debug_mode_q ? EXC_PC_DBG_EXC : EXC_PC_EXC); |
| if (WritebackStage) begin : g_writeback_mepc_save |
| csr_save_id_o = ~(store_err_q | load_err_q); |
| csr_save_wb_o = store_err_q | load_err_q; |
| end |
| else begin : g_no_writeback_mepc_save |
| csr_save_id_o = 1'b0; |
| end |
| csr_save_cause_o = 1'b1; |
| case (1'b1) |
| instr_fetch_err_prio: begin |
| exc_cause_o = EXC_CAUSE_INSTR_ACCESS_FAULT; |
| csr_mtval_o = (instr_fetch_err_plus2_i ? pc_id_i + 32'd2 : pc_id_i); |
| end |
| illegal_insn_prio: begin |
| exc_cause_o = EXC_CAUSE_ILLEGAL_INSN; |
| csr_mtval_o = (instr_is_compressed_i ? {16'b0000000000000000, instr_compressed_i} : instr_i); |
| end |
| ecall_insn_prio: exc_cause_o = (priv_mode_i == PRIV_LVL_M ? EXC_CAUSE_ECALL_MMODE : EXC_CAUSE_ECALL_UMODE); |
| ebrk_insn_prio: |
| if (debug_mode_q | ebreak_into_debug) begin |
| pc_set_o = 1'b0; |
| pc_set_spec_o = 1'b0; |
| csr_save_id_o = 1'b0; |
| csr_save_cause_o = 1'b0; |
| ctrl_fsm_ns = DBG_TAKEN_ID; |
| flush_id = 1'b0; |
| end |
| else |
| exc_cause_o = EXC_CAUSE_BREAKPOINT; |
| store_err_prio: begin |
| exc_cause_o = EXC_CAUSE_STORE_ACCESS_FAULT; |
| csr_mtval_o = lsu_addr_last_i; |
| end |
| load_err_prio: begin |
| exc_cause_o = EXC_CAUSE_LOAD_ACCESS_FAULT; |
| csr_mtval_o = lsu_addr_last_i; |
| end |
| default: |
| ; |
| endcase |
| end |
| else if (mret_insn) begin |
| pc_mux_o = PC_ERET; |
| pc_set_o = 1'b1; |
| pc_set_spec_o = 1'b1; |
| csr_restore_mret_id_o = 1'b1; |
| if (nmi_mode_q) |
| nmi_mode_d = 1'b0; |
| end |
| else if (dret_insn) begin |
| pc_mux_o = PC_DRET; |
| pc_set_o = 1'b1; |
| pc_set_spec_o = 1'b1; |
| debug_mode_d = 1'b0; |
| csr_restore_dret_id_o = 1'b1; |
| end |
| else if (wfi_insn) |
| ctrl_fsm_ns = WAIT_SLEEP; |
| else if (csr_pipe_flush && handle_irq) |
| ctrl_fsm_ns = IRQ_TAKEN; |
| if (enter_debug_mode && !(ebrk_insn_prio && ebreak_into_debug)) |
| ctrl_fsm_ns = DBG_TAKEN_IF; |
| end |
| default: begin |
| instr_req_o = 1'b0; |
| ctrl_fsm_ns = RESET; |
| end |
| endcase |
| end |
| assign flush_id_o = flush_id; |
| assign debug_mode_o = debug_mode_q; |
| assign nmi_mode_o = nmi_mode_q; |
| assign stall = stall_id_i | stall_wb_i; |
| assign id_in_ready_o = (~stall & ~halt_if) & ~retain_id; |
| assign instr_valid_clear_o = ~(stall | retain_id) | flush_id; |
| always @(posedge clk_i or negedge rst_ni) begin : update_regs |
| if (!rst_ni) begin |
| ctrl_fsm_cs <= RESET; |
| nmi_mode_q <= 1'b0; |
| debug_mode_q <= 1'b0; |
| load_err_q <= 1'b0; |
| store_err_q <= 1'b0; |
| exc_req_q <= 1'b0; |
| illegal_insn_q <= 1'b0; |
| end |
| else begin |
| ctrl_fsm_cs <= ctrl_fsm_ns; |
| nmi_mode_q <= nmi_mode_d; |
| debug_mode_q <= debug_mode_d; |
| load_err_q <= load_err_d; |
| store_err_q <= store_err_d; |
| exc_req_q <= exc_req_d; |
| illegal_insn_q <= illegal_insn_d; |
| end |
| end |
| endmodule |
| module brqrv_idu_dec ( |
| clk_i, |
| rst_ni, |
| illegal_insn_o, |
| ebrk_insn_o, |
| mret_insn_o, |
| dret_insn_o, |
| ecall_insn_o, |
| wfi_insn_o, |
| jump_set_o, |
| branch_taken_i, |
| icache_inval_o, |
| instr_first_cycle_i, |
| instr_rdata_i, |
| instr_rdata_alu_i, |
| illegal_c_insn_i, |
| imm_a_mux_sel_o, |
| imm_b_mux_sel_o, |
| bt_a_mux_sel_o, |
| bt_b_mux_sel_o, |
| imm_i_type_o, |
| imm_s_type_o, |
| imm_b_type_o, |
| imm_u_type_o, |
| imm_j_type_o, |
| zimm_rs1_type_o, |
| rf_wdata_sel_o, |
| rf_we_o, |
| rf_raddr_a_o, |
| rf_raddr_b_o, |
| rf_waddr_o, |
| rf_ren_a_o, |
| rf_ren_b_o, |
| alu_operator_o, |
| alu_op_a_mux_sel_o, |
| alu_op_b_mux_sel_o, |
| alu_multicycle_o, |
| mult_en_o, |
| div_en_o, |
| mult_sel_o, |
| div_sel_o, |
| multdiv_operator_o, |
| multdiv_signed_mode_o, |
| csr_access_o, |
| csr_op_o, |
| data_req_o, |
| data_we_o, |
| data_type_o, |
| data_sign_extension_o, |
| jump_in_dec_o, |
| branch_in_dec_o |
| ); |
| parameter [0:0] RV32E = 0; |
| localparam integer brqrv_pkg_RV32MFast = 2; |
| parameter integer RV32M = brqrv_pkg_RV32MFast; |
| localparam integer brqrv_pkg_RV32BNone = 0; |
| parameter integer RV32B = brqrv_pkg_RV32BNone; |
| parameter [0:0] BranchTargetALU = 0; |
| input wire clk_i; |
| input wire rst_ni; |
| output wire illegal_insn_o; |
| output reg ebrk_insn_o; |
| output reg mret_insn_o; |
| output reg dret_insn_o; |
| output reg ecall_insn_o; |
| output reg wfi_insn_o; |
| output reg jump_set_o; |
| input wire branch_taken_i; |
| output reg icache_inval_o; |
| input wire instr_first_cycle_i; |
| input wire [31:0] instr_rdata_i; |
| input wire [31:0] instr_rdata_alu_i; |
| input wire illegal_c_insn_i; |
| output reg imm_a_mux_sel_o; |
| output reg [2:0] imm_b_mux_sel_o; |
| output reg [1:0] bt_a_mux_sel_o; |
| output reg [2:0] bt_b_mux_sel_o; |
| output wire [31:0] imm_i_type_o; |
| output wire [31:0] imm_s_type_o; |
| output wire [31:0] imm_b_type_o; |
| output wire [31:0] imm_u_type_o; |
| output wire [31:0] imm_j_type_o; |
| output wire [31:0] zimm_rs1_type_o; |
| output reg rf_wdata_sel_o; |
| output wire rf_we_o; |
| output wire [4:0] rf_raddr_a_o; |
| output wire [4:0] rf_raddr_b_o; |
| output wire [4:0] rf_waddr_o; |
| output reg rf_ren_a_o; |
| output reg rf_ren_b_o; |
| output reg [5:0] alu_operator_o; |
| output reg [1:0] alu_op_a_mux_sel_o; |
| output reg alu_op_b_mux_sel_o; |
| output reg alu_multicycle_o; |
| output wire mult_en_o; |
| output wire div_en_o; |
| output reg mult_sel_o; |
| output reg div_sel_o; |
| output reg [1:0] multdiv_operator_o; |
| output reg [1:0] multdiv_signed_mode_o; |
| output reg csr_access_o; |
| output reg [1:0] csr_op_o; |
| output reg data_req_o; |
| output reg data_we_o; |
| output reg [1:0] data_type_o; |
| output reg data_sign_extension_o; |
| output reg jump_in_dec_o; |
| output reg branch_in_dec_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| reg illegal_insn; |
| wire illegal_reg_rv32e; |
| reg csr_illegal; |
| reg rf_we; |
| wire [31:0] instr; |
| wire [31:0] instr_alu; |
| wire [4:0] instr_rs1; |
| wire [4:0] instr_rs2; |
| wire [4:0] instr_rs3; |
| wire [4:0] instr_rd; |
| reg use_rs3_d; |
| reg use_rs3_q; |
| reg [1:0] csr_op; |
| reg [6:0] opcode; |
| reg [6:0] opcode_alu; |
| assign instr = instr_rdata_i; |
| assign instr_alu = instr_rdata_alu_i; |
| assign imm_i_type_o = {{20 {instr[31]}}, instr[31:20]}; |
| assign imm_s_type_o = {{20 {instr[31]}}, instr[31:25], instr[11:7]}; |
| assign imm_b_type_o = {{19 {instr[31]}}, instr[31], instr[7], instr[30:25], instr[11:8], 1'b0}; |
| assign imm_u_type_o = {instr[31:12], 12'b000000000000}; |
| assign imm_j_type_o = {{12 {instr[31]}}, instr[19:12], instr[20], instr[30:21], 1'b0}; |
| assign zimm_rs1_type_o = {27'b000000000000000000000000000, instr_rs1}; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| use_rs3_q <= 1'b0; |
| else |
| use_rs3_q <= use_rs3_d; |
| assign instr_rs1 = instr[19:15]; |
| assign instr_rs2 = instr[24:20]; |
| assign instr_rs3 = instr[31:27]; |
| assign rf_raddr_a_o = (use_rs3_q & ~instr_first_cycle_i ? instr_rs3 : instr_rs1); |
| assign rf_raddr_b_o = instr_rs2; |
| assign instr_rd = instr[11:7]; |
| assign rf_waddr_o = instr_rd; |
| generate |
| if (RV32E) begin : gen_rv32e_reg_check_active |
| assign illegal_reg_rv32e = ((rf_raddr_a_o[4] & (alu_op_a_mux_sel_o == OP_A_REG_A)) | (rf_raddr_b_o[4] & (alu_op_b_mux_sel_o == OP_B_REG_B))) | (rf_waddr_o[4] & rf_we); |
| end |
| else begin : gen_rv32e_reg_check_inactive |
| assign illegal_reg_rv32e = 1'b0; |
| end |
| endgenerate |
| always @(*) begin : csr_operand_check |
| csr_op_o = csr_op; |
| if (((csr_op == CSR_OP_SET) || (csr_op == CSR_OP_CLEAR)) && (instr_rs1 == {5 {1'sb0}})) |
| csr_op_o = CSR_OP_READ; |
| end |
| function automatic [6:0] sv2v_cast_7; |
| input reg [6:0] inp; |
| sv2v_cast_7 = inp; |
| endfunction |
| always @(*) begin |
| jump_in_dec_o = 1'b0; |
| jump_set_o = 1'b0; |
| branch_in_dec_o = 1'b0; |
| icache_inval_o = 1'b0; |
| multdiv_operator_o = MD_OP_MULL; |
| multdiv_signed_mode_o = 2'b00; |
| rf_wdata_sel_o = RF_WD_EX; |
| rf_we = 1'b0; |
| rf_ren_a_o = 1'b0; |
| rf_ren_b_o = 1'b0; |
| csr_access_o = 1'b0; |
| csr_illegal = 1'b0; |
| csr_op = CSR_OP_READ; |
| data_we_o = 1'b0; |
| data_type_o = 2'b00; |
| data_sign_extension_o = 1'b0; |
| data_req_o = 1'b0; |
| illegal_insn = 1'b0; |
| ebrk_insn_o = 1'b0; |
| mret_insn_o = 1'b0; |
| dret_insn_o = 1'b0; |
| ecall_insn_o = 1'b0; |
| wfi_insn_o = 1'b0; |
| opcode = sv2v_cast_7(instr[6:0]); |
| case (opcode) |
| OPCODE_JAL: begin |
| jump_in_dec_o = 1'b1; |
| if (instr_first_cycle_i) begin |
| rf_we = BranchTargetALU; |
| jump_set_o = 1'b1; |
| end |
| else |
| rf_we = 1'b1; |
| end |
| OPCODE_JALR: begin |
| jump_in_dec_o = 1'b1; |
| if (instr_first_cycle_i) begin |
| rf_we = BranchTargetALU; |
| jump_set_o = 1'b1; |
| end |
| else |
| rf_we = 1'b1; |
| if (instr[14:12] != 3'b000) |
| illegal_insn = 1'b1; |
| rf_ren_a_o = 1'b1; |
| end |
| OPCODE_BRANCH: begin |
| branch_in_dec_o = 1'b1; |
| case (instr[14:12]) |
| 3'b000, 3'b001, 3'b100, 3'b101, 3'b110, 3'b111: illegal_insn = 1'b0; |
| default: illegal_insn = 1'b1; |
| endcase |
| rf_ren_a_o = 1'b1; |
| rf_ren_b_o = 1'b1; |
| end |
| OPCODE_STORE: begin |
| rf_ren_a_o = 1'b1; |
| rf_ren_b_o = 1'b1; |
| data_req_o = 1'b1; |
| data_we_o = 1'b1; |
| if (instr[14]) |
| illegal_insn = 1'b1; |
| case (instr[13:12]) |
| 2'b00: data_type_o = 2'b10; |
| 2'b01: data_type_o = 2'b01; |
| 2'b10: data_type_o = 2'b00; |
| default: illegal_insn = 1'b1; |
| endcase |
| end |
| OPCODE_LOAD: begin |
| rf_ren_a_o = 1'b1; |
| data_req_o = 1'b1; |
| data_type_o = 2'b00; |
| data_sign_extension_o = ~instr[14]; |
| case (instr[13:12]) |
| 2'b00: data_type_o = 2'b10; |
| 2'b01: data_type_o = 2'b01; |
| 2'b10: begin |
| data_type_o = 2'b00; |
| if (instr[14]) |
| illegal_insn = 1'b1; |
| end |
| default: illegal_insn = 1'b1; |
| endcase |
| end |
| OPCODE_LUI: rf_we = 1'b1; |
| OPCODE_AUIPC: rf_we = 1'b1; |
| OPCODE_OP_IMM: begin |
| rf_ren_a_o = 1'b1; |
| rf_we = 1'b1; |
| case (instr[14:12]) |
| 3'b000, 3'b010, 3'b011, 3'b100, 3'b110, 3'b111: illegal_insn = 1'b0; |
| 3'b001: |
| case (instr[31:27]) |
| 5'b00000: illegal_insn = (instr[26:25] == 2'b00 ? 1'b0 : 1'b1); |
| 5'b00100, 5'b01001, 5'b00101, 5'b01101: illegal_insn = (RV32B != RV32BNone ? 1'b0 : 1'b1); |
| 5'b00001: |
| if (instr[26] == 1'b0) |
| illegal_insn = (RV32B == RV32BFull ? 1'b0 : 1'b1); |
| else |
| illegal_insn = 1'b1; |
| 5'b01100: |
| case (instr[26:20]) |
| 7'b0000000, 7'b0000001, 7'b0000010, 7'b0000100, 7'b0000101: illegal_insn = (RV32B != RV32BNone ? 1'b0 : 1'b1); |
| 7'b0010000, 7'b0010001, 7'b0010010, 7'b0011000, 7'b0011001, 7'b0011010: illegal_insn = (RV32B == RV32BFull ? 1'b0 : 1'b1); |
| default: illegal_insn = 1'b1; |
| endcase |
| default: illegal_insn = 1'b1; |
| endcase |
| 3'b101: |
| if (instr[26]) |
| illegal_insn = (RV32B != RV32BNone ? 1'b0 : 1'b1); |
| else |
| case (instr[31:27]) |
| 5'b00000, 5'b01000: illegal_insn = (instr[26:25] == 2'b00 ? 1'b0 : 1'b1); |
| 5'b00100, 5'b01100, 5'b01001: illegal_insn = (RV32B != RV32BNone ? 1'b0 : 1'b1); |
| 5'b01101: |
| if (RV32B == RV32BFull) |
| illegal_insn = 1'b0; |
| else |
| case (instr[24:20]) |
| 5'b11111, 5'b11000: illegal_insn = (RV32B == RV32BBalanced ? 1'b0 : 1'b1); |
| default: illegal_insn = 1'b1; |
| endcase |
| 5'b00101: |
| if (RV32B == RV32BFull) |
| illegal_insn = 1'b0; |
| else if (instr[24:20] == 5'b00111) |
| illegal_insn = (RV32B == RV32BBalanced ? 1'b0 : 1'b1); |
| 5'b00001: |
| if (instr[26] == 1'b0) |
| illegal_insn = (RV32B == RV32BFull ? 1'b0 : 1'b1); |
| else |
| illegal_insn = 1'b1; |
| default: illegal_insn = 1'b1; |
| endcase |
| default: illegal_insn = 1'b1; |
| endcase |
| end |
| OPCODE_OP: begin |
| rf_ren_a_o = 1'b1; |
| rf_ren_b_o = 1'b1; |
| rf_we = 1'b1; |
| if ({instr[26], instr[13:12]} == {1'b1, 2'b01}) |
| illegal_insn = (RV32B != RV32BNone ? 1'b0 : 1'b1); |
| else |
| case ({instr[31:25], instr[14:12]}) |
| {7'b0000000, 3'b000}, {7'b0100000, 3'b000}, {7'b0000000, 3'b010}, {7'b0000000, 3'b011}, {7'b0000000, 3'b100}, {7'b0000000, 3'b110}, {7'b0000000, 3'b111}, {7'b0000000, 3'b001}, {7'b0000000, 3'b101}, {7'b0100000, 3'b101}: illegal_insn = 1'b0; |
| {7'b0100000, 3'b111}, {7'b0100000, 3'b110}, {7'b0100000, 3'b100}, {7'b0010000, 3'b001}, {7'b0010000, 3'b101}, {7'b0110000, 3'b001}, {7'b0110000, 3'b101}, {7'b0000101, 3'b100}, {7'b0000101, 3'b101}, {7'b0000101, 3'b110}, {7'b0000101, 3'b111}, {7'b0000100, 3'b100}, {7'b0100100, 3'b100}, {7'b0000100, 3'b111}, {7'b0100100, 3'b001}, {7'b0010100, 3'b001}, {7'b0110100, 3'b001}, {7'b0100100, 3'b101}, {7'b0100100, 3'b111}: illegal_insn = (RV32B != RV32BNone ? 1'b0 : 1'b1); |
| {7'b0100100, 3'b110}, {7'b0000100, 3'b110}, {7'b0110100, 3'b101}, {7'b0010100, 3'b101}, {7'b0000100, 3'b001}, {7'b0000100, 3'b101}, {7'b0000101, 3'b001}, {7'b0000101, 3'b010}, {7'b0000101, 3'b011}: illegal_insn = (RV32B == RV32BFull ? 1'b0 : 1'b1); |
| {7'b0000001, 3'b000}: begin |
| multdiv_operator_o = MD_OP_MULL; |
| multdiv_signed_mode_o = 2'b00; |
| illegal_insn = (RV32M == RV32MNone ? 1'b1 : 1'b0); |
| end |
| {7'b0000001, 3'b001}: begin |
| multdiv_operator_o = MD_OP_MULH; |
| multdiv_signed_mode_o = 2'b11; |
| illegal_insn = (RV32M == RV32MNone ? 1'b1 : 1'b0); |
| end |
| {7'b0000001, 3'b010}: begin |
| multdiv_operator_o = MD_OP_MULH; |
| multdiv_signed_mode_o = 2'b01; |
| illegal_insn = (RV32M == RV32MNone ? 1'b1 : 1'b0); |
| end |
| {7'b0000001, 3'b011}: begin |
| multdiv_operator_o = MD_OP_MULH; |
| multdiv_signed_mode_o = 2'b00; |
| illegal_insn = (RV32M == RV32MNone ? 1'b1 : 1'b0); |
| end |
| {7'b0000001, 3'b100}: begin |
| multdiv_operator_o = MD_OP_DIV; |
| multdiv_signed_mode_o = 2'b11; |
| illegal_insn = (RV32M == RV32MNone ? 1'b1 : 1'b0); |
| end |
| {7'b0000001, 3'b101}: begin |
| multdiv_operator_o = MD_OP_DIV; |
| multdiv_signed_mode_o = 2'b00; |
| illegal_insn = (RV32M == RV32MNone ? 1'b1 : 1'b0); |
| end |
| {7'b0000001, 3'b110}: begin |
| multdiv_operator_o = MD_OP_REM; |
| multdiv_signed_mode_o = 2'b11; |
| illegal_insn = (RV32M == RV32MNone ? 1'b1 : 1'b0); |
| end |
| {7'b0000001, 3'b111}: begin |
| multdiv_operator_o = MD_OP_REM; |
| multdiv_signed_mode_o = 2'b00; |
| illegal_insn = (RV32M == RV32MNone ? 1'b1 : 1'b0); |
| end |
| default: illegal_insn = 1'b1; |
| endcase |
| end |
| OPCODE_MISC_MEM: |
| case (instr[14:12]) |
| 3'b000: rf_we = 1'b0; |
| 3'b001: begin |
| jump_in_dec_o = 1'b1; |
| rf_we = 1'b0; |
| if (instr_first_cycle_i) begin |
| jump_set_o = 1'b1; |
| icache_inval_o = 1'b1; |
| end |
| end |
| default: illegal_insn = 1'b1; |
| endcase |
| OPCODE_SYSTEM: |
| if (instr[14:12] == 3'b000) begin |
| case (instr[31:20]) |
| 12'h000: ecall_insn_o = 1'b1; |
| 12'h001: ebrk_insn_o = 1'b1; |
| 12'h302: mret_insn_o = 1'b1; |
| 12'h7b2: dret_insn_o = 1'b1; |
| 12'h105: wfi_insn_o = 1'b1; |
| default: illegal_insn = 1'b1; |
| endcase |
| if ((instr_rs1 != 5'b00000) || (instr_rd != 5'b00000)) |
| illegal_insn = 1'b1; |
| end |
| else begin |
| csr_access_o = 1'b1; |
| rf_wdata_sel_o = RF_WD_CSR; |
| rf_we = 1'b1; |
| if (~instr[14]) |
| rf_ren_a_o = 1'b1; |
| case (instr[13:12]) |
| 2'b01: csr_op = CSR_OP_WRITE; |
| 2'b10: csr_op = CSR_OP_SET; |
| 2'b11: csr_op = CSR_OP_CLEAR; |
| default: csr_illegal = 1'b1; |
| endcase |
| illegal_insn = csr_illegal; |
| end |
| default: illegal_insn = 1'b1; |
| endcase |
| if (illegal_c_insn_i) |
| illegal_insn = 1'b1; |
| if (illegal_insn) begin |
| rf_we = 1'b0; |
| data_req_o = 1'b0; |
| data_we_o = 1'b0; |
| jump_in_dec_o = 1'b0; |
| jump_set_o = 1'b0; |
| branch_in_dec_o = 1'b0; |
| csr_access_o = 1'b0; |
| end |
| end |
| always @(*) begin |
| alu_operator_o = ALU_SLTU; |
| alu_op_a_mux_sel_o = OP_A_IMM; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_a_mux_sel_o = IMM_A_ZERO; |
| imm_b_mux_sel_o = IMM_B_I; |
| bt_a_mux_sel_o = OP_A_CURRPC; |
| bt_b_mux_sel_o = IMM_B_I; |
| opcode_alu = sv2v_cast_7(instr_alu[6:0]); |
| use_rs3_d = 1'b0; |
| alu_multicycle_o = 1'b0; |
| mult_sel_o = 1'b0; |
| div_sel_o = 1'b0; |
| case (opcode_alu) |
| OPCODE_JAL: begin |
| if (BranchTargetALU) begin |
| bt_a_mux_sel_o = OP_A_CURRPC; |
| bt_b_mux_sel_o = IMM_B_J; |
| end |
| if (instr_first_cycle_i && !BranchTargetALU) begin |
| alu_op_a_mux_sel_o = OP_A_CURRPC; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_b_mux_sel_o = IMM_B_J; |
| alu_operator_o = ALU_ADD; |
| end |
| else begin |
| alu_op_a_mux_sel_o = OP_A_CURRPC; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_b_mux_sel_o = IMM_B_INCR_PC; |
| alu_operator_o = ALU_ADD; |
| end |
| end |
| OPCODE_JALR: begin |
| if (BranchTargetALU) begin |
| bt_a_mux_sel_o = OP_A_REG_A; |
| bt_b_mux_sel_o = IMM_B_I; |
| end |
| if (instr_first_cycle_i && !BranchTargetALU) begin |
| alu_op_a_mux_sel_o = OP_A_REG_A; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_b_mux_sel_o = IMM_B_I; |
| alu_operator_o = ALU_ADD; |
| end |
| else begin |
| alu_op_a_mux_sel_o = OP_A_CURRPC; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_b_mux_sel_o = IMM_B_INCR_PC; |
| alu_operator_o = ALU_ADD; |
| end |
| end |
| OPCODE_BRANCH: begin |
| case (instr_alu[14:12]) |
| 3'b000: alu_operator_o = ALU_EQ; |
| 3'b001: alu_operator_o = ALU_NE; |
| 3'b100: alu_operator_o = ALU_LT; |
| 3'b101: alu_operator_o = ALU_GE; |
| 3'b110: alu_operator_o = ALU_LTU; |
| 3'b111: alu_operator_o = ALU_GEU; |
| default: |
| ; |
| endcase |
| if (BranchTargetALU) begin |
| bt_a_mux_sel_o = OP_A_CURRPC; |
| bt_b_mux_sel_o = (branch_taken_i ? IMM_B_B : IMM_B_INCR_PC); |
| end |
| if (instr_first_cycle_i) begin |
| alu_op_a_mux_sel_o = OP_A_REG_A; |
| alu_op_b_mux_sel_o = OP_B_REG_B; |
| end |
| else begin |
| alu_op_a_mux_sel_o = OP_A_CURRPC; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_b_mux_sel_o = (branch_taken_i ? IMM_B_B : IMM_B_INCR_PC); |
| alu_operator_o = ALU_ADD; |
| end |
| end |
| OPCODE_STORE: begin |
| alu_op_a_mux_sel_o = OP_A_REG_A; |
| alu_op_b_mux_sel_o = OP_B_REG_B; |
| alu_operator_o = ALU_ADD; |
| if (!instr_alu[14]) begin |
| imm_b_mux_sel_o = IMM_B_S; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| end |
| end |
| OPCODE_LOAD: begin |
| alu_op_a_mux_sel_o = OP_A_REG_A; |
| alu_operator_o = ALU_ADD; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_b_mux_sel_o = IMM_B_I; |
| end |
| OPCODE_LUI: begin |
| alu_op_a_mux_sel_o = OP_A_IMM; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_a_mux_sel_o = IMM_A_ZERO; |
| imm_b_mux_sel_o = IMM_B_U; |
| alu_operator_o = ALU_ADD; |
| end |
| OPCODE_AUIPC: begin |
| alu_op_a_mux_sel_o = OP_A_CURRPC; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_b_mux_sel_o = IMM_B_U; |
| alu_operator_o = ALU_ADD; |
| end |
| OPCODE_OP_IMM: begin |
| alu_op_a_mux_sel_o = OP_A_REG_A; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_b_mux_sel_o = IMM_B_I; |
| case (instr_alu[14:12]) |
| 3'b000: alu_operator_o = ALU_ADD; |
| 3'b010: alu_operator_o = ALU_SLT; |
| 3'b011: alu_operator_o = ALU_SLTU; |
| 3'b100: alu_operator_o = ALU_XOR; |
| 3'b110: alu_operator_o = ALU_OR; |
| 3'b111: alu_operator_o = ALU_AND; |
| 3'b001: |
| if (RV32B != RV32BNone) |
| case (instr_alu[31:27]) |
| 5'b00000: alu_operator_o = ALU_SLL; |
| 5'b00100: alu_operator_o = ALU_SLO; |
| 5'b01001: alu_operator_o = ALU_SBCLR; |
| 5'b00101: alu_operator_o = ALU_SBSET; |
| 5'b01101: alu_operator_o = ALU_SBINV; |
| 5'b00001: |
| if (instr_alu[26] == 0) |
| alu_operator_o = ALU_SHFL; |
| 5'b01100: |
| case (instr_alu[26:20]) |
| 7'b0000000: alu_operator_o = ALU_CLZ; |
| 7'b0000001: alu_operator_o = ALU_CTZ; |
| 7'b0000010: alu_operator_o = ALU_PCNT; |
| 7'b0000100: alu_operator_o = ALU_SEXTB; |
| 7'b0000101: alu_operator_o = ALU_SEXTH; |
| 7'b0010000: |
| if (RV32B == RV32BFull) begin |
| alu_operator_o = ALU_CRC32_B; |
| alu_multicycle_o = 1'b1; |
| end |
| 7'b0010001: |
| if (RV32B == RV32BFull) begin |
| alu_operator_o = ALU_CRC32_H; |
| alu_multicycle_o = 1'b1; |
| end |
| 7'b0010010: |
| if (RV32B == RV32BFull) begin |
| alu_operator_o = ALU_CRC32_W; |
| alu_multicycle_o = 1'b1; |
| end |
| 7'b0011000: |
| if (RV32B == RV32BFull) begin |
| alu_operator_o = ALU_CRC32C_B; |
| alu_multicycle_o = 1'b1; |
| end |
| 7'b0011001: |
| if (RV32B == RV32BFull) begin |
| alu_operator_o = ALU_CRC32C_H; |
| alu_multicycle_o = 1'b1; |
| end |
| 7'b0011010: |
| if (RV32B == RV32BFull) begin |
| alu_operator_o = ALU_CRC32C_W; |
| alu_multicycle_o = 1'b1; |
| end |
| default: |
| ; |
| endcase |
| default: |
| ; |
| endcase |
| else |
| alu_operator_o = ALU_SLL; |
| 3'b101: |
| if (RV32B != RV32BNone) begin |
| if (instr_alu[26] == 1'b1) begin |
| alu_operator_o = ALU_FSR; |
| alu_multicycle_o = 1'b1; |
| if (instr_first_cycle_i) |
| use_rs3_d = 1'b1; |
| else |
| use_rs3_d = 1'b0; |
| end |
| else |
| case (instr_alu[31:27]) |
| 5'b00000: alu_operator_o = ALU_SRL; |
| 5'b01000: alu_operator_o = ALU_SRA; |
| 5'b00100: alu_operator_o = ALU_SRO; |
| 5'b01001: alu_operator_o = ALU_SBEXT; |
| 5'b01100: begin |
| alu_operator_o = ALU_ROR; |
| alu_multicycle_o = 1'b1; |
| end |
| 5'b01101: alu_operator_o = ALU_GREV; |
| 5'b00101: alu_operator_o = ALU_GORC; |
| 5'b00001: |
| if (RV32B == RV32BFull) |
| if (instr_alu[26] == 1'b0) |
| alu_operator_o = ALU_UNSHFL; |
| default: |
| ; |
| endcase |
| end |
| else if (instr_alu[31:27] == 5'b00000) |
| alu_operator_o = ALU_SRL; |
| else if (instr_alu[31:27] == 5'b01000) |
| alu_operator_o = ALU_SRA; |
| default: |
| ; |
| endcase |
| end |
| OPCODE_OP: begin |
| alu_op_a_mux_sel_o = OP_A_REG_A; |
| alu_op_b_mux_sel_o = OP_B_REG_B; |
| if (instr_alu[26]) begin |
| if (RV32B != RV32BNone) |
| case ({instr_alu[26:25], instr_alu[14:12]}) |
| {2'b11, 3'b001}: begin |
| alu_operator_o = ALU_CMIX; |
| alu_multicycle_o = 1'b1; |
| if (instr_first_cycle_i) |
| use_rs3_d = 1'b1; |
| else |
| use_rs3_d = 1'b0; |
| end |
| {2'b11, 3'b101}: begin |
| alu_operator_o = ALU_CMOV; |
| alu_multicycle_o = 1'b1; |
| if (instr_first_cycle_i) |
| use_rs3_d = 1'b1; |
| else |
| use_rs3_d = 1'b0; |
| end |
| {2'b10, 3'b001}: begin |
| alu_operator_o = ALU_FSL; |
| alu_multicycle_o = 1'b1; |
| if (instr_first_cycle_i) |
| use_rs3_d = 1'b1; |
| else |
| use_rs3_d = 1'b0; |
| end |
| {2'b10, 3'b101}: begin |
| alu_operator_o = ALU_FSR; |
| alu_multicycle_o = 1'b1; |
| if (instr_first_cycle_i) |
| use_rs3_d = 1'b1; |
| else |
| use_rs3_d = 1'b0; |
| end |
| default: |
| ; |
| endcase |
| end |
| else |
| case ({instr_alu[31:25], instr_alu[14:12]}) |
| {7'b0000000, 3'b000}: alu_operator_o = ALU_ADD; |
| {7'b0100000, 3'b000}: alu_operator_o = ALU_SUB; |
| {7'b0000000, 3'b010}: alu_operator_o = ALU_SLT; |
| {7'b0000000, 3'b011}: alu_operator_o = ALU_SLTU; |
| {7'b0000000, 3'b100}: alu_operator_o = ALU_XOR; |
| {7'b0000000, 3'b110}: alu_operator_o = ALU_OR; |
| {7'b0000000, 3'b111}: alu_operator_o = ALU_AND; |
| {7'b0000000, 3'b001}: alu_operator_o = ALU_SLL; |
| {7'b0000000, 3'b101}: alu_operator_o = ALU_SRL; |
| {7'b0100000, 3'b101}: alu_operator_o = ALU_SRA; |
| {7'b0010000, 3'b001}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_SLO; |
| {7'b0010000, 3'b101}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_SRO; |
| {7'b0110000, 3'b001}: |
| if (RV32B != RV32BNone) begin |
| alu_operator_o = ALU_ROL; |
| alu_multicycle_o = 1'b1; |
| end |
| {7'b0110000, 3'b101}: |
| if (RV32B != RV32BNone) begin |
| alu_operator_o = ALU_ROR; |
| alu_multicycle_o = 1'b1; |
| end |
| {7'b0000101, 3'b100}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_MIN; |
| {7'b0000101, 3'b101}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_MAX; |
| {7'b0000101, 3'b110}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_MINU; |
| {7'b0000101, 3'b111}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_MAXU; |
| {7'b0000100, 3'b100}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_PACK; |
| {7'b0100100, 3'b100}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_PACKU; |
| {7'b0000100, 3'b111}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_PACKH; |
| {7'b0100000, 3'b100}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_XNOR; |
| {7'b0100000, 3'b110}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_ORN; |
| {7'b0100000, 3'b111}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_ANDN; |
| {7'b0100100, 3'b001}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_SBCLR; |
| {7'b0010100, 3'b001}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_SBSET; |
| {7'b0110100, 3'b001}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_SBINV; |
| {7'b0100100, 3'b101}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_SBEXT; |
| {7'b0100100, 3'b111}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_BFP; |
| {7'b0110100, 3'b101}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_GREV; |
| {7'b0010100, 3'b101}: |
| if (RV32B != RV32BNone) |
| alu_operator_o = ALU_GORC; |
| {7'b0000100, 3'b001}: |
| if (RV32B == RV32BFull) |
| alu_operator_o = ALU_SHFL; |
| {7'b0000100, 3'b101}: |
| if (RV32B == RV32BFull) |
| alu_operator_o = ALU_UNSHFL; |
| {7'b0000101, 3'b001}: |
| if (RV32B == RV32BFull) |
| alu_operator_o = ALU_CLMUL; |
| {7'b0000101, 3'b010}: |
| if (RV32B == RV32BFull) |
| alu_operator_o = ALU_CLMULR; |
| {7'b0000101, 3'b011}: |
| if (RV32B == RV32BFull) |
| alu_operator_o = ALU_CLMULH; |
| {7'b0100100, 3'b110}: |
| if (RV32B == RV32BFull) begin |
| alu_operator_o = ALU_BDEP; |
| alu_multicycle_o = 1'b1; |
| end |
| {7'b0000100, 3'b110}: |
| if (RV32B == RV32BFull) begin |
| alu_operator_o = ALU_BEXT; |
| alu_multicycle_o = 1'b1; |
| end |
| {7'b0000001, 3'b000}: begin |
| alu_operator_o = ALU_ADD; |
| mult_sel_o = (RV32M == RV32MNone ? 1'b0 : 1'b1); |
| end |
| {7'b0000001, 3'b001}: begin |
| alu_operator_o = ALU_ADD; |
| mult_sel_o = (RV32M == RV32MNone ? 1'b0 : 1'b1); |
| end |
| {7'b0000001, 3'b010}: begin |
| alu_operator_o = ALU_ADD; |
| mult_sel_o = (RV32M == RV32MNone ? 1'b0 : 1'b1); |
| end |
| {7'b0000001, 3'b011}: begin |
| alu_operator_o = ALU_ADD; |
| mult_sel_o = (RV32M == RV32MNone ? 1'b0 : 1'b1); |
| end |
| {7'b0000001, 3'b100}: begin |
| alu_operator_o = ALU_ADD; |
| div_sel_o = (RV32M == RV32MNone ? 1'b0 : 1'b1); |
| end |
| {7'b0000001, 3'b101}: begin |
| alu_operator_o = ALU_ADD; |
| div_sel_o = (RV32M == RV32MNone ? 1'b0 : 1'b1); |
| end |
| {7'b0000001, 3'b110}: begin |
| alu_operator_o = ALU_ADD; |
| div_sel_o = (RV32M == RV32MNone ? 1'b0 : 1'b1); |
| end |
| {7'b0000001, 3'b111}: begin |
| alu_operator_o = ALU_ADD; |
| div_sel_o = (RV32M == RV32MNone ? 1'b0 : 1'b1); |
| end |
| default: |
| ; |
| endcase |
| end |
| OPCODE_MISC_MEM: |
| case (instr_alu[14:12]) |
| 3'b000: begin |
| alu_operator_o = ALU_ADD; |
| alu_op_a_mux_sel_o = OP_A_REG_A; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| end |
| 3'b001: |
| if (BranchTargetALU) begin |
| bt_a_mux_sel_o = OP_A_CURRPC; |
| bt_b_mux_sel_o = IMM_B_INCR_PC; |
| end |
| else begin |
| alu_op_a_mux_sel_o = OP_A_CURRPC; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_b_mux_sel_o = IMM_B_INCR_PC; |
| alu_operator_o = ALU_ADD; |
| end |
| default: |
| ; |
| endcase |
| OPCODE_SYSTEM: |
| if (instr_alu[14:12] == 3'b000) begin |
| alu_op_a_mux_sel_o = OP_A_REG_A; |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| end |
| else begin |
| alu_op_b_mux_sel_o = OP_B_IMM; |
| imm_a_mux_sel_o = IMM_A_Z; |
| imm_b_mux_sel_o = IMM_B_I; |
| if (instr_alu[14]) |
| alu_op_a_mux_sel_o = OP_A_IMM; |
| else |
| alu_op_a_mux_sel_o = OP_A_REG_A; |
| end |
| default: |
| ; |
| endcase |
| end |
| assign mult_en_o = (illegal_insn ? 1'b0 : mult_sel_o); |
| assign div_en_o = (illegal_insn ? 1'b0 : div_sel_o); |
| assign illegal_insn_o = illegal_insn | illegal_reg_rv32e; |
| assign rf_we_o = rf_we & ~illegal_reg_rv32e; |
| endmodule |
| module brqrv_ifu ( |
| clk_i, |
| rst_ni, |
| boot_addr_i, |
| req_i, |
| instr_req_o, |
| instr_addr_o, |
| instr_gnt_i, |
| instr_rvalid_i, |
| instr_rdata_i, |
| instr_err_i, |
| instr_pmp_err_i, |
| instr_valid_id_o, |
| instr_new_id_o, |
| instr_rdata_id_o, |
| instr_rdata_alu_id_o, |
| instr_rdata_c_id_o, |
| instr_is_compressed_id_o, |
| instr_bp_taken_o, |
| instr_fetch_err_o, |
| instr_fetch_err_plus2_o, |
| illegal_c_insn_id_o, |
| dummy_instr_id_o, |
| pc_if_o, |
| pc_id_o, |
| instr_valid_clear_i, |
| pc_set_i, |
| pc_set_spec_i, |
| pc_mux_i, |
| nt_branch_mispredict_i, |
| exc_pc_mux_i, |
| exc_cause, |
| dummy_instr_en_i, |
| dummy_instr_mask_i, |
| dummy_instr_seed_en_i, |
| dummy_instr_seed_i, |
| icache_enable_i, |
| icache_inval_i, |
| branch_target_ex_i, |
| csr_mepc_i, |
| csr_depc_i, |
| csr_mtvec_i, |
| csr_mtvec_init_o, |
| id_in_ready_i, |
| pc_mismatch_alert_o, |
| if_busy_o |
| ); |
| parameter [31:0] DmHaltAddr = 32'h1a110800; |
| parameter [31:0] DmExceptionAddr = 32'h1a110808; |
| parameter [0:0] DummyInstructions = 1'b0; |
| parameter [0:0] ICache = 1'b0; |
| parameter [0:0] ICacheECC = 1'b0; |
| parameter [0:0] SecureBuraq = 1'b0; |
| parameter [0:0] BranchPredictor = 1'b0; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire [31:0] boot_addr_i; |
| input wire req_i; |
| output wire instr_req_o; |
| output wire [31:0] instr_addr_o; |
| input wire instr_gnt_i; |
| input wire instr_rvalid_i; |
| input wire [31:0] instr_rdata_i; |
| input wire instr_err_i; |
| input wire instr_pmp_err_i; |
| output wire instr_valid_id_o; |
| output wire instr_new_id_o; |
| output reg [31:0] instr_rdata_id_o; |
| output reg [31:0] instr_rdata_alu_id_o; |
| output reg [15:0] instr_rdata_c_id_o; |
| output reg instr_is_compressed_id_o; |
| output wire instr_bp_taken_o; |
| output reg instr_fetch_err_o; |
| output reg instr_fetch_err_plus2_o; |
| output reg illegal_c_insn_id_o; |
| output wire dummy_instr_id_o; |
| output wire [31:0] pc_if_o; |
| output reg [31:0] pc_id_o; |
| input wire instr_valid_clear_i; |
| input wire pc_set_i; |
| input wire pc_set_spec_i; |
| input wire [2:0] pc_mux_i; |
| input wire nt_branch_mispredict_i; |
| input wire [1:0] exc_pc_mux_i; |
| input wire [5:0] exc_cause; |
| input wire dummy_instr_en_i; |
| input wire [2:0] dummy_instr_mask_i; |
| input wire dummy_instr_seed_en_i; |
| input wire [31:0] dummy_instr_seed_i; |
| input wire icache_enable_i; |
| input wire icache_inval_i; |
| input wire [31:0] branch_target_ex_i; |
| input wire [31:0] csr_mepc_i; |
| input wire [31:0] csr_depc_i; |
| input wire [31:0] csr_mtvec_i; |
| output wire csr_mtvec_init_o; |
| input wire id_in_ready_i; |
| output wire pc_mismatch_alert_o; |
| output wire if_busy_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| wire instr_valid_id_d; |
| reg instr_valid_id_q; |
| wire instr_new_id_d; |
| reg instr_new_id_q; |
| wire prefetch_busy; |
| wire branch_req; |
| wire branch_spec; |
| wire predicted_branch; |
| reg [31:0] fetch_addr_n; |
| wire fetch_valid; |
| wire fetch_ready; |
| wire [31:0] fetch_rdata; |
| wire [31:0] fetch_addr; |
| wire fetch_err; |
| wire fetch_err_plus2; |
| wire if_instr_valid; |
| wire [31:0] if_instr_rdata; |
| wire [31:0] if_instr_addr; |
| wire if_instr_err; |
| reg [31:0] exc_pc; |
| wire [5:0] irq_id; |
| wire unused_irq_bit; |
| wire if_id_pipe_reg_we; |
| wire stall_dummy_instr; |
| wire [31:0] instr_out; |
| wire instr_is_compressed_out; |
| wire illegal_c_instr_out; |
| wire instr_err_out; |
| wire predict_branch_taken; |
| wire [31:0] predict_branch_pc; |
| wire [2:0] pc_mux_internal; |
| wire [7:0] unused_boot_addr; |
| wire [7:0] unused_csr_mtvec; |
| assign unused_boot_addr = boot_addr_i[7:0]; |
| assign unused_csr_mtvec = csr_mtvec_i[7:0]; |
| assign irq_id = exc_cause; |
| assign unused_irq_bit = irq_id[5]; |
| always @(*) begin : exc_pc_mux |
| case (exc_pc_mux_i) |
| EXC_PC_EXC: exc_pc = {csr_mtvec_i[31:8], 8'h00}; |
| EXC_PC_IRQ: exc_pc = {csr_mtvec_i[31:8], 1'b0, irq_id[4:0], 2'b00}; |
| EXC_PC_DBD: exc_pc = DmHaltAddr; |
| EXC_PC_DBG_EXC: exc_pc = DmExceptionAddr; |
| default: exc_pc = {csr_mtvec_i[31:8], 8'h00}; |
| endcase |
| end |
| assign pc_mux_internal = ((BranchPredictor && predict_branch_taken) && !pc_set_i ? PC_BP : pc_mux_i); |
| always @(*) begin : fetch_addr_mux |
| case (pc_mux_internal) |
| PC_BOOT: fetch_addr_n = {boot_addr_i[31:8], 8'h80}; |
| PC_JUMP: fetch_addr_n = branch_target_ex_i; |
| PC_EXC: fetch_addr_n = exc_pc; |
| PC_ERET: fetch_addr_n = csr_mepc_i; |
| PC_DRET: fetch_addr_n = csr_depc_i; |
| PC_BP: fetch_addr_n = (BranchPredictor ? predict_branch_pc : {boot_addr_i[31:8], 8'h80}); |
| default: fetch_addr_n = {boot_addr_i[31:8], 8'h80}; |
| endcase |
| end |
| assign csr_mtvec_init_o = (pc_mux_i == PC_BOOT) & pc_set_i; |
| brqrv_ifu_prefetch #(.BranchPredictor(BranchPredictor)) prefetch_buffer_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .req_i(req_i), |
| .branch_i(branch_req), |
| .branch_spec_i(branch_spec), |
| .predicted_branch_i(predicted_branch), |
| .branch_mispredict_i(nt_branch_mispredict_i), |
| .addr_i({fetch_addr_n[31:1], 1'b0}), |
| .ready_i(fetch_ready), |
| .valid_o(fetch_valid), |
| .rdata_o(fetch_rdata), |
| .addr_o(fetch_addr), |
| .err_o(fetch_err), |
| .err_plus2_o(fetch_err_plus2), |
| .instr_req_o(instr_req_o), |
| .instr_addr_o(instr_addr_o), |
| .instr_gnt_i(instr_gnt_i), |
| .instr_rvalid_i(instr_rvalid_i), |
| .instr_rdata_i(instr_rdata_i), |
| .instr_err_i(instr_err_i), |
| .instr_pmp_err_i(instr_pmp_err_i), |
| .busy_o(prefetch_busy) |
| ); |
| wire unused_icen; |
| wire unused_icinv; |
| assign unused_icen = icache_enable_i; |
| assign unused_icinv = icache_inval_i; |
| assign branch_req = pc_set_i | predict_branch_taken; |
| assign branch_spec = pc_set_spec_i | predict_branch_taken; |
| assign pc_if_o = if_instr_addr; |
| assign if_busy_o = prefetch_busy; |
| wire [31:0] instr_decompressed; |
| wire illegal_c_insn; |
| wire instr_is_compressed; |
| brqrv_ifu_compressed_decoder compressed_decoder_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .valid_i(fetch_valid & ~fetch_err), |
| .instr_i(if_instr_rdata), |
| .instr_o(instr_decompressed), |
| .is_compressed_o(instr_is_compressed), |
| .illegal_instr_o(illegal_c_insn) |
| ); |
| wire unused_dummy_en; |
| wire [2:0] unused_dummy_mask; |
| wire unused_dummy_seed_en; |
| wire [31:0] unused_dummy_seed; |
| assign unused_dummy_en = dummy_instr_en_i; |
| assign unused_dummy_mask = dummy_instr_mask_i; |
| assign unused_dummy_seed_en = dummy_instr_seed_en_i; |
| assign unused_dummy_seed = dummy_instr_seed_i; |
| assign instr_out = instr_decompressed; |
| assign instr_is_compressed_out = instr_is_compressed; |
| assign illegal_c_instr_out = illegal_c_insn; |
| assign instr_err_out = if_instr_err; |
| assign stall_dummy_instr = 1'b0; |
| assign dummy_instr_id_o = 1'b0; |
| assign instr_valid_id_d = ((if_instr_valid & id_in_ready_i) & ~pc_set_i) | (instr_valid_id_q & ~instr_valid_clear_i); |
| assign instr_new_id_d = if_instr_valid & id_in_ready_i; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| instr_valid_id_q <= 1'b0; |
| instr_new_id_q <= 1'b0; |
| end |
| else begin |
| instr_valid_id_q <= instr_valid_id_d; |
| instr_new_id_q <= instr_new_id_d; |
| end |
| assign instr_valid_id_o = instr_valid_id_q; |
| assign instr_new_id_o = instr_new_id_q; |
| assign if_id_pipe_reg_we = instr_new_id_d; |
| always @(posedge clk_i) |
| if (if_id_pipe_reg_we) begin |
| instr_rdata_id_o <= instr_out; |
| instr_rdata_alu_id_o <= instr_out; |
| instr_fetch_err_o <= instr_err_out; |
| instr_fetch_err_plus2_o <= fetch_err_plus2; |
| instr_rdata_c_id_o <= if_instr_rdata[15:0]; |
| instr_is_compressed_id_o <= instr_is_compressed_out; |
| illegal_c_insn_id_o <= illegal_c_instr_out; |
| pc_id_o <= pc_if_o; |
| end |
| generate |
| if (SecureBuraq) begin : g_secure_pc |
| wire [31:0] prev_instr_addr_incr; |
| reg prev_instr_seq_q; |
| wire prev_instr_seq_d; |
| assign prev_instr_seq_d = (prev_instr_seq_q | instr_new_id_d) & ~branch_req; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| prev_instr_seq_q <= 1'b0; |
| else |
| prev_instr_seq_q <= prev_instr_seq_d; |
| assign prev_instr_addr_incr = pc_id_o + (instr_is_compressed_id_o ? 32'd2 : 32'd4); |
| assign pc_mismatch_alert_o = prev_instr_seq_q & (pc_if_o != prev_instr_addr_incr); |
| end |
| else begin : g_no_secure_pc |
| assign pc_mismatch_alert_o = 1'b0; |
| end |
| endgenerate |
| assign instr_bp_taken_o = 1'b0; |
| assign predict_branch_taken = 1'b0; |
| assign predicted_branch = 1'b0; |
| assign predict_branch_pc = 32'b00000000000000000000000000000000; |
| assign if_instr_valid = fetch_valid; |
| assign if_instr_rdata = fetch_rdata; |
| assign if_instr_addr = fetch_addr; |
| assign if_instr_err = fetch_err; |
| assign fetch_ready = id_in_ready_i & ~stall_dummy_instr; |
| endmodule |
| module brqrv_ifu_compressed_decoder ( |
| clk_i, |
| rst_ni, |
| valid_i, |
| instr_i, |
| instr_o, |
| is_compressed_o, |
| illegal_instr_o |
| ); |
| input wire clk_i; |
| input wire rst_ni; |
| input wire valid_i; |
| input wire [31:0] instr_i; |
| output reg [31:0] instr_o; |
| output wire is_compressed_o; |
| output reg illegal_instr_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| wire unused_valid; |
| assign unused_valid = valid_i; |
| always @(*) begin |
| instr_o = instr_i; |
| illegal_instr_o = 1'b0; |
| case (instr_i[1:0]) |
| 2'b00: |
| case (instr_i[15:13]) |
| 3'b000: begin |
| instr_o = {2'b00, instr_i[10:7], instr_i[12:11], instr_i[5], instr_i[6], 2'b00, 5'h02, 3'b000, 2'b01, instr_i[4:2], OPCODE_OP_IMM}; |
| if (instr_i[12:5] == 8'b00000000) |
| illegal_instr_o = 1'b1; |
| end |
| 3'b010: instr_o = {5'b00000, instr_i[5], instr_i[12:10], instr_i[6], 2'b00, 2'b01, instr_i[9:7], 3'b010, 2'b01, instr_i[4:2], OPCODE_LOAD}; |
| 3'b110: instr_o = {5'b00000, instr_i[5], instr_i[12], 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b010, instr_i[11:10], instr_i[6], 2'b00, OPCODE_STORE}; |
| 3'b001, 3'b011, 3'b100, 3'b101, 3'b111: illegal_instr_o = 1'b1; |
| default: illegal_instr_o = 1'b1; |
| endcase |
| 2'b01: |
| case (instr_i[15:13]) |
| 3'b000: instr_o = {{6 {instr_i[12]}}, instr_i[12], instr_i[6:2], instr_i[11:7], 3'b000, instr_i[11:7], OPCODE_OP_IMM}; |
| 3'b001, 3'b101: instr_o = {instr_i[12], instr_i[8], instr_i[10:9], instr_i[6], instr_i[7], instr_i[2], instr_i[11], instr_i[5:3], {9 {instr_i[12]}}, 4'b0000, ~instr_i[15], OPCODE_JAL}; |
| 3'b010: instr_o = {{6 {instr_i[12]}}, instr_i[12], instr_i[6:2], 5'b00000, 3'b000, instr_i[11:7], OPCODE_OP_IMM}; |
| 3'b011: begin |
| instr_o = {{15 {instr_i[12]}}, instr_i[6:2], instr_i[11:7], OPCODE_LUI}; |
| if (instr_i[11:7] == 5'h02) |
| instr_o = {{3 {instr_i[12]}}, instr_i[4:3], instr_i[5], instr_i[2], instr_i[6], 4'b0000, 5'h02, 3'b000, 5'h02, OPCODE_OP_IMM}; |
| if ({instr_i[12], instr_i[6:2]} == 6'b000000) |
| illegal_instr_o = 1'b1; |
| end |
| 3'b100: |
| case (instr_i[11:10]) |
| 2'b00, 2'b01: begin |
| instr_o = {1'b0, instr_i[10], 5'b00000, instr_i[6:2], 2'b01, instr_i[9:7], 3'b101, 2'b01, instr_i[9:7], OPCODE_OP_IMM}; |
| if (instr_i[12] == 1'b1) |
| illegal_instr_o = 1'b1; |
| end |
| 2'b10: instr_o = {{6 {instr_i[12]}}, instr_i[12], instr_i[6:2], 2'b01, instr_i[9:7], 3'b111, 2'b01, instr_i[9:7], OPCODE_OP_IMM}; |
| 2'b11: |
| case ({instr_i[12], instr_i[6:5]}) |
| 3'b000: instr_o = {2'b01, 5'b00000, 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b000, 2'b01, instr_i[9:7], OPCODE_OP}; |
| 3'b001: instr_o = {7'b0000000, 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b100, 2'b01, instr_i[9:7], OPCODE_OP}; |
| 3'b010: instr_o = {7'b0000000, 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b110, 2'b01, instr_i[9:7], OPCODE_OP}; |
| 3'b011: instr_o = {7'b0000000, 2'b01, instr_i[4:2], 2'b01, instr_i[9:7], 3'b111, 2'b01, instr_i[9:7], OPCODE_OP}; |
| 3'b100, 3'b101, 3'b110, 3'b111: illegal_instr_o = 1'b1; |
| default: illegal_instr_o = 1'b1; |
| endcase |
| default: illegal_instr_o = 1'b1; |
| endcase |
| 3'b110, 3'b111: instr_o = {{4 {instr_i[12]}}, instr_i[6:5], instr_i[2], 5'b00000, 2'b01, instr_i[9:7], 2'b00, instr_i[13], instr_i[11:10], instr_i[4:3], instr_i[12], OPCODE_BRANCH}; |
| default: illegal_instr_o = 1'b1; |
| endcase |
| 2'b10: |
| case (instr_i[15:13]) |
| 3'b000: begin |
| instr_o = {7'b0000000, instr_i[6:2], instr_i[11:7], 3'b001, instr_i[11:7], OPCODE_OP_IMM}; |
| if (instr_i[12] == 1'b1) |
| illegal_instr_o = 1'b1; |
| end |
| 3'b010: begin |
| instr_o = {4'b0000, instr_i[3:2], instr_i[12], instr_i[6:4], 2'b00, 5'h02, 3'b010, instr_i[11:7], OPCODE_LOAD}; |
| if (instr_i[11:7] == 5'b00000) |
| illegal_instr_o = 1'b1; |
| end |
| 3'b100: |
| if (instr_i[12] == 1'b0) begin |
| if (instr_i[6:2] != 5'b00000) |
| instr_o = {7'b0000000, instr_i[6:2], 5'b00000, 3'b000, instr_i[11:7], OPCODE_OP}; |
| else begin |
| instr_o = {12'b000000000000, instr_i[11:7], 3'b000, 5'b00000, OPCODE_JALR}; |
| if (instr_i[11:7] == 5'b00000) |
| illegal_instr_o = 1'b1; |
| end |
| end |
| else if (instr_i[6:2] != 5'b00000) |
| instr_o = {7'b0000000, instr_i[6:2], instr_i[11:7], 3'b000, instr_i[11:7], OPCODE_OP}; |
| else if (instr_i[11:7] == 5'b00000) |
| instr_o = 32'h00100073; |
| else |
| instr_o = {12'b000000000000, instr_i[11:7], 3'b000, 5'b00001, OPCODE_JALR}; |
| 3'b110: instr_o = {4'b0000, instr_i[8:7], instr_i[12], instr_i[6:2], 5'h02, 3'b010, instr_i[11:9], 2'b00, OPCODE_STORE}; |
| 3'b001, 3'b011, 3'b101, 3'b111: illegal_instr_o = 1'b1; |
| default: illegal_instr_o = 1'b1; |
| endcase |
| 2'b11: |
| ; |
| default: illegal_instr_o = 1'b1; |
| endcase |
| end |
| assign is_compressed_o = instr_i[1:0] != 2'b11; |
| endmodule |
| /*module brqrv_ifu_dummy_instr ( |
| clk_i, |
| rst_ni, |
| dummy_instr_en_i, |
| dummy_instr_mask_i, |
| dummy_instr_seed_en_i, |
| dummy_instr_seed_i, |
| fetch_valid_i, |
| id_in_ready_i, |
| insert_dummy_instr_o, |
| dummy_instr_data_o |
| ); |
| input wire clk_i; |
| input wire rst_ni; |
| input wire dummy_instr_en_i; |
| input wire [2:0] dummy_instr_mask_i; |
| input wire dummy_instr_seed_en_i; |
| input wire [31:0] dummy_instr_seed_i; |
| input wire fetch_valid_i; |
| input wire id_in_ready_i; |
| output wire insert_dummy_instr_o; |
| output wire [31:0] dummy_instr_data_o; |
| localparam [31:0] TIMEOUT_CNT_W = 5; |
| localparam [31:0] OP_W = 5; |
| localparam [31:0] LFSR_OUT_W = ((2 + OP_W) + OP_W) + TIMEOUT_CNT_W; |
| wire [(((2 + OP_W) + OP_W) + TIMEOUT_CNT_W) - 1:0] lfsr_data; |
| wire [TIMEOUT_CNT_W - 1:0] dummy_cnt_incr; |
| wire [TIMEOUT_CNT_W - 1:0] dummy_cnt_threshold; |
| wire [TIMEOUT_CNT_W - 1:0] dummy_cnt_d; |
| reg [TIMEOUT_CNT_W - 1:0] dummy_cnt_q; |
| wire dummy_cnt_en; |
| wire lfsr_en; |
| wire [LFSR_OUT_W - 1:0] lfsr_state; |
| wire insert_dummy_instr; |
| reg [6:0] dummy_set; |
| reg [2:0] dummy_opcode; |
| wire [31:0] dummy_instr; |
| reg [31:0] dummy_instr_seed_q; |
| wire [31:0] dummy_instr_seed_d; |
| assign lfsr_en = insert_dummy_instr & id_in_ready_i; |
| assign dummy_instr_seed_d = dummy_instr_seed_q ^ dummy_instr_seed_i; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| dummy_instr_seed_q <= {32 {1'sb0}}; |
| else if (dummy_instr_seed_en_i) |
| dummy_instr_seed_q <= dummy_instr_seed_d; |
| prim_lfsr #( |
| .LfsrDw(32), |
| .StateOutDw(LFSR_OUT_W) |
| ) lfsr_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .seed_en_i(dummy_instr_seed_en_i), |
| .seed_i(dummy_instr_seed_d), |
| .lfsr_en_i(lfsr_en), |
| .entropy_i('0), |
| .state_o(lfsr_state) |
| ); |
| function automatic [(((2 + OP_W) + OP_W) + TIMEOUT_CNT_W) - 1:0] sv2v_cast_4AF33; |
| input reg [(((2 + OP_W) + OP_W) + TIMEOUT_CNT_W) - 1:0] inp; |
| sv2v_cast_4AF33 = inp; |
| endfunction |
| assign lfsr_data = sv2v_cast_4AF33(lfsr_state); |
| assign dummy_cnt_threshold = lfsr_data[TIMEOUT_CNT_W - 1-:TIMEOUT_CNT_W] & {dummy_instr_mask_i, {TIMEOUT_CNT_W - 3 {1'b1}}}; |
| assign dummy_cnt_incr = dummy_cnt_q + {{TIMEOUT_CNT_W - 1 {1'b0}}, 1'b1}; |
| assign dummy_cnt_d = (insert_dummy_instr ? {TIMEOUT_CNT_W {1'sb0}} : dummy_cnt_incr); |
| assign dummy_cnt_en = (dummy_instr_en_i & id_in_ready_i) & (fetch_valid_i | insert_dummy_instr); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| dummy_cnt_q <= {TIMEOUT_CNT_W {1'sb0}}; |
| else if (dummy_cnt_en) |
| dummy_cnt_q <= dummy_cnt_d; |
| assign insert_dummy_instr = dummy_instr_en_i & (dummy_cnt_q == dummy_cnt_threshold); |
| localparam [1:0] DUMMY_ADD = 2'b00; |
| localparam [1:0] DUMMY_AND = 2'b11; |
| localparam [1:0] DUMMY_DIV = 2'b10; |
| localparam [1:0] DUMMY_MUL = 2'b01; |
| always @(*) |
| case (lfsr_data[2 + (OP_W + (OP_W + (TIMEOUT_CNT_W - 1)))-:((2 + (OP_W + (OP_W + (TIMEOUT_CNT_W - 1)))) - (OP_W + (OP_W + TIMEOUT_CNT_W))) + 1]) |
| DUMMY_ADD: begin |
| dummy_set = 7'b0000000; |
| dummy_opcode = 3'b000; |
| end |
| DUMMY_MUL: begin |
| dummy_set = 7'b0000001; |
| dummy_opcode = 3'b000; |
| end |
| DUMMY_DIV: begin |
| dummy_set = 7'b0000001; |
| dummy_opcode = 3'b100; |
| end |
| DUMMY_AND: begin |
| dummy_set = 7'b0000000; |
| dummy_opcode = 3'b111; |
| end |
| default: begin |
| dummy_set = 7'b0000000; |
| dummy_opcode = 3'b000; |
| end |
| endcase |
| assign dummy_instr = {dummy_set, lfsr_data[OP_W + (OP_W + (TIMEOUT_CNT_W - 1))-:((OP_W + (OP_W + (TIMEOUT_CNT_W - 1))) - (OP_W + TIMEOUT_CNT_W)) + 1], lfsr_data[OP_W + (TIMEOUT_CNT_W - 1)-:((OP_W + (TIMEOUT_CNT_W - 1)) - TIMEOUT_CNT_W) + 1], dummy_opcode, 5'h00, 7'h33}; |
| assign insert_dummy_instr_o = insert_dummy_instr; |
| assign dummy_instr_data_o = dummy_instr; |
| endmodule |
| */ |
| module brqrv_ifu_prefetch ( |
| clk_i, |
| rst_ni, |
| req_i, |
| branch_i, |
| branch_spec_i, |
| predicted_branch_i, |
| branch_mispredict_i, |
| addr_i, |
| ready_i, |
| valid_o, |
| rdata_o, |
| addr_o, |
| err_o, |
| err_plus2_o, |
| instr_req_o, |
| instr_gnt_i, |
| instr_addr_o, |
| instr_rdata_i, |
| instr_err_i, |
| instr_pmp_err_i, |
| instr_rvalid_i, |
| busy_o |
| ); |
| parameter [0:0] BranchPredictor = 1'b0; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire req_i; |
| input wire branch_i; |
| input wire branch_spec_i; |
| input wire predicted_branch_i; |
| input wire branch_mispredict_i; |
| input wire [31:0] addr_i; |
| input wire ready_i; |
| output wire valid_o; |
| output wire [31:0] rdata_o; |
| output wire [31:0] addr_o; |
| output wire err_o; |
| output wire err_plus2_o; |
| output wire instr_req_o; |
| input wire instr_gnt_i; |
| output wire [31:0] instr_addr_o; |
| input wire [31:0] instr_rdata_i; |
| input wire instr_err_i; |
| input wire instr_pmp_err_i; |
| input wire instr_rvalid_i; |
| output wire busy_o; |
| localparam [31:0] NUM_REQS = 2; |
| wire branch_suppress; |
| wire valid_new_req; |
| wire valid_req; |
| wire valid_req_d; |
| reg valid_req_q; |
| wire discard_req_d; |
| reg discard_req_q; |
| wire gnt_or_pmp_err; |
| wire rvalid_or_pmp_err; |
| wire [NUM_REQS - 1:0] rdata_outstanding_n; |
| wire [NUM_REQS - 1:0] rdata_outstanding_s; |
| reg [NUM_REQS - 1:0] rdata_outstanding_q; |
| wire [NUM_REQS - 1:0] branch_discard_n; |
| wire [NUM_REQS - 1:0] branch_discard_s; |
| reg [NUM_REQS - 1:0] branch_discard_q; |
| wire [NUM_REQS - 1:0] rdata_pmp_err_n; |
| wire [NUM_REQS - 1:0] rdata_pmp_err_s; |
| reg [NUM_REQS - 1:0] rdata_pmp_err_q; |
| wire [NUM_REQS - 1:0] rdata_outstanding_rev; |
| wire [31:0] stored_addr_d; |
| reg [31:0] stored_addr_q; |
| wire stored_addr_en; |
| wire [31:0] fetch_addr_d; |
| reg [31:0] fetch_addr_q; |
| wire fetch_addr_en; |
| wire [31:0] branch_mispredict_addr; |
| wire [31:0] instr_addr; |
| wire [31:0] instr_addr_w_aligned; |
| wire instr_or_pmp_err; |
| wire fifo_valid; |
| wire [31:0] fifo_addr; |
| wire fifo_ready; |
| wire fifo_clear; |
| wire [NUM_REQS - 1:0] fifo_busy; |
| wire valid_raw; |
| wire [31:0] addr_next; |
| wire branch_or_mispredict; |
| assign busy_o = |rdata_outstanding_q | instr_req_o; |
| assign branch_or_mispredict = branch_i | branch_mispredict_i; |
| assign instr_or_pmp_err = instr_err_i | rdata_pmp_err_q[0]; |
| assign fifo_clear = branch_or_mispredict; |
| generate |
| genvar i; |
| for (i = 0; i < NUM_REQS; i = i + 1) begin : gen_rd_rev |
| assign rdata_outstanding_rev[i] = rdata_outstanding_q[(NUM_REQS - 1) - i]; |
| end |
| endgenerate |
| assign fifo_ready = ~&(fifo_busy | rdata_outstanding_rev); |
| brqrv_ifu_prefetch_fifo #(.NUM_REQS(NUM_REQS)) fifo_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .clear_i(fifo_clear), |
| .busy_o(fifo_busy), |
| .in_valid_i(fifo_valid), |
| .in_addr_i(fifo_addr), |
| .in_rdata_i(instr_rdata_i), |
| .in_err_i(instr_or_pmp_err), |
| .out_valid_o(valid_raw), |
| .out_ready_i(ready_i), |
| .out_rdata_o(rdata_o), |
| .out_addr_o(addr_o), |
| .out_addr_next_o(addr_next), |
| .out_err_o(err_o), |
| .out_err_plus2_o(err_plus2_o) |
| ); |
| assign branch_suppress = branch_spec_i & ~branch_i; |
| assign valid_new_req = ((~branch_suppress & req_i) & (fifo_ready | branch_or_mispredict)) & ~rdata_outstanding_q[NUM_REQS - 1]; |
| assign valid_req = valid_req_q | valid_new_req; |
| assign gnt_or_pmp_err = instr_gnt_i | instr_pmp_err_i; |
| assign rvalid_or_pmp_err = rdata_outstanding_q[0] & (instr_rvalid_i | rdata_pmp_err_q[0]); |
| assign valid_req_d = valid_req & ~gnt_or_pmp_err; |
| assign discard_req_d = valid_req_q & (branch_or_mispredict | discard_req_q); |
| assign stored_addr_en = (valid_new_req & ~valid_req_q) & ~gnt_or_pmp_err; |
| assign stored_addr_d = instr_addr; |
| always @(posedge clk_i) |
| if (stored_addr_en) |
| stored_addr_q <= stored_addr_d; |
| generate |
| if (BranchPredictor) begin : g_branch_predictor |
| reg [31:0] branch_mispredict_addr_q; |
| wire branch_mispredict_addr_en; |
| assign branch_mispredict_addr_en = branch_i & predicted_branch_i; |
| always @(posedge clk_i) |
| if (branch_mispredict_addr_en) |
| branch_mispredict_addr_q <= addr_next; |
| assign branch_mispredict_addr = branch_mispredict_addr_q; |
| end |
| else begin : g_no_branch_predictor |
| wire unused_predicted_branch; |
| wire [31:0] unused_addr_next; |
| assign unused_predicted_branch = predicted_branch_i; |
| assign unused_addr_next = addr_next; |
| assign branch_mispredict_addr = {32 {1'sb0}}; |
| end |
| endgenerate |
| assign fetch_addr_en = branch_or_mispredict | (valid_new_req & ~valid_req_q); |
| assign fetch_addr_d = (branch_i ? addr_i : (branch_mispredict_i ? {branch_mispredict_addr[31:2], 2'b00} : {fetch_addr_q[31:2], 2'b00})) + {{29 {1'b0}}, valid_new_req & ~valid_req_q, 2'b00}; |
| always @(posedge clk_i) |
| if (fetch_addr_en) |
| fetch_addr_q <= fetch_addr_d; |
| assign instr_addr = (valid_req_q ? stored_addr_q : (branch_spec_i ? addr_i : (branch_mispredict_i ? branch_mispredict_addr : fetch_addr_q))); |
| assign instr_addr_w_aligned = {instr_addr[31:2], 2'b00}; |
| generate |
| for (i = 0; i < NUM_REQS; i = i + 1) begin : g_outstanding_reqs |
| if (i == 0) begin : g_req0 |
| assign rdata_outstanding_n[i] = (valid_req & gnt_or_pmp_err) | rdata_outstanding_q[i]; |
| assign branch_discard_n[i] = (((valid_req & gnt_or_pmp_err) & discard_req_d) | (branch_or_mispredict & rdata_outstanding_q[i])) | branch_discard_q[i]; |
| assign rdata_pmp_err_n[i] = ((valid_req & ~rdata_outstanding_q[i]) & instr_pmp_err_i) | rdata_pmp_err_q[i]; |
| end |
| else begin : g_reqtop |
| assign rdata_outstanding_n[i] = ((valid_req & gnt_or_pmp_err) & rdata_outstanding_q[i - 1]) | rdata_outstanding_q[i]; |
| assign branch_discard_n[i] = ((((valid_req & gnt_or_pmp_err) & discard_req_d) & rdata_outstanding_q[i - 1]) | (branch_or_mispredict & rdata_outstanding_q[i])) | branch_discard_q[i]; |
| assign rdata_pmp_err_n[i] = (((valid_req & ~rdata_outstanding_q[i]) & instr_pmp_err_i) & rdata_outstanding_q[i - 1]) | rdata_pmp_err_q[i]; |
| end |
| end |
| endgenerate |
| assign rdata_outstanding_s = (rvalid_or_pmp_err ? {1'b0, rdata_outstanding_n[NUM_REQS - 1:1]} : rdata_outstanding_n); |
| assign branch_discard_s = (rvalid_or_pmp_err ? {1'b0, branch_discard_n[NUM_REQS - 1:1]} : branch_discard_n); |
| assign rdata_pmp_err_s = (rvalid_or_pmp_err ? {1'b0, rdata_pmp_err_n[NUM_REQS - 1:1]} : rdata_pmp_err_n); |
| assign fifo_valid = rvalid_or_pmp_err & ~branch_discard_q[0]; |
| assign fifo_addr = (branch_mispredict_i ? branch_mispredict_addr : addr_i); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| valid_req_q <= 1'b0; |
| discard_req_q <= 1'b0; |
| rdata_outstanding_q <= 'b0; |
| branch_discard_q <= 'b0; |
| rdata_pmp_err_q <= 'b0; |
| end |
| else begin |
| valid_req_q <= valid_req_d; |
| discard_req_q <= discard_req_d; |
| rdata_outstanding_q <= rdata_outstanding_s; |
| branch_discard_q <= branch_discard_s; |
| rdata_pmp_err_q <= rdata_pmp_err_s; |
| end |
| assign instr_req_o = valid_req; |
| assign instr_addr_o = instr_addr_w_aligned; |
| assign valid_o = valid_raw & ~branch_mispredict_i; |
| endmodule |
| module brqrv_ifu_prefetch_fifo ( |
| clk_i, |
| rst_ni, |
| clear_i, |
| busy_o, |
| in_valid_i, |
| in_addr_i, |
| in_rdata_i, |
| in_err_i, |
| out_valid_o, |
| out_ready_i, |
| out_addr_o, |
| out_addr_next_o, |
| out_rdata_o, |
| out_err_o, |
| out_err_plus2_o |
| ); |
| parameter [31:0] NUM_REQS = 2; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire clear_i; |
| output wire [NUM_REQS - 1:0] busy_o; |
| input wire in_valid_i; |
| input wire [31:0] in_addr_i; |
| input wire [31:0] in_rdata_i; |
| input wire in_err_i; |
| output reg out_valid_o; |
| input wire out_ready_i; |
| output wire [31:0] out_addr_o; |
| output wire [31:0] out_addr_next_o; |
| output reg [31:0] out_rdata_o; |
| output reg out_err_o; |
| output reg out_err_plus2_o; |
| localparam [31:0] DEPTH = NUM_REQS + 1; |
| wire [(DEPTH * 32) - 1:0] rdata_d; |
| reg [(DEPTH * 32) - 1:0] rdata_q; |
| wire [DEPTH - 1:0] err_d; |
| reg [DEPTH - 1:0] err_q; |
| wire [DEPTH - 1:0] valid_d; |
| reg [DEPTH - 1:0] valid_q; |
| wire [DEPTH - 1:0] lowest_free_entry; |
| wire [DEPTH - 1:0] valid_pushed; |
| wire [DEPTH - 1:0] valid_popped; |
| wire [DEPTH - 1:0] entry_en; |
| wire pop_fifo; |
| wire [31:0] rdata; |
| wire [31:0] rdata_unaligned; |
| wire err; |
| wire err_unaligned; |
| wire err_plus2; |
| wire valid; |
| wire valid_unaligned; |
| wire aligned_is_compressed; |
| wire unaligned_is_compressed; |
| wire addr_incr_two; |
| wire [31:1] instr_addr_next; |
| wire [31:1] instr_addr_d; |
| reg [31:1] instr_addr_q; |
| wire instr_addr_en; |
| wire unused_addr_in; |
| assign rdata = (valid_q[0] ? rdata_q[0+:32] : in_rdata_i); |
| assign err = (valid_q[0] ? err_q[0] : in_err_i); |
| assign valid = valid_q[0] | in_valid_i; |
| assign rdata_unaligned = (valid_q[1] ? {rdata_q[47-:16], rdata[31:16]} : {in_rdata_i[15:0], rdata[31:16]}); |
| assign err_unaligned = (valid_q[1] ? (err_q[1] & ~unaligned_is_compressed) | err_q[0] : (valid_q[0] & err_q[0]) | (in_err_i & (~valid_q[0] | ~unaligned_is_compressed))); |
| assign err_plus2 = (valid_q[1] ? err_q[1] & ~err_q[0] : (in_err_i & valid_q[0]) & ~err_q[0]); |
| assign valid_unaligned = (valid_q[1] ? 1'b1 : valid_q[0] & in_valid_i); |
| assign unaligned_is_compressed = (rdata[17:16] != 2'b11) | err; |
| assign aligned_is_compressed = (rdata[1:0] != 2'b11) & ~err; |
| always @(*) |
| if (out_addr_o[1]) begin |
| out_rdata_o = rdata_unaligned; |
| out_err_o = err_unaligned; |
| out_err_plus2_o = err_plus2; |
| if (unaligned_is_compressed) |
| out_valid_o = valid; |
| else |
| out_valid_o = valid_unaligned; |
| end |
| else begin |
| out_rdata_o = rdata; |
| out_err_o = err; |
| out_err_plus2_o = 1'b0; |
| out_valid_o = valid; |
| end |
| assign instr_addr_en = clear_i | (out_ready_i & out_valid_o); |
| assign addr_incr_two = (instr_addr_q[1] ? unaligned_is_compressed : aligned_is_compressed); |
| assign instr_addr_next = instr_addr_q[31:1] + {29'd0, ~addr_incr_two, addr_incr_two}; |
| assign instr_addr_d = (clear_i ? in_addr_i[31:1] : instr_addr_next); |
| always @(posedge clk_i) |
| if (instr_addr_en) |
| instr_addr_q <= instr_addr_d; |
| assign out_addr_next_o = {instr_addr_next, 1'b0}; |
| assign out_addr_o = {instr_addr_q, 1'b0}; |
| assign unused_addr_in = in_addr_i[0]; |
| assign busy_o = valid_q[DEPTH - 1:DEPTH - NUM_REQS]; |
| assign pop_fifo = (out_ready_i & out_valid_o) & (~aligned_is_compressed | out_addr_o[1]); |
| generate |
| genvar i; |
| for (i = 0; i < (DEPTH - 1); i = i + 1) begin : g_fifo_next |
| if (i == 0) begin : g_ent0 |
| assign lowest_free_entry[i] = ~valid_q[i]; |
| end |
| else begin : g_ent_others |
| assign lowest_free_entry[i] = ~valid_q[i] & valid_q[i - 1]; |
| end |
| assign valid_pushed[i] = (in_valid_i & lowest_free_entry[i]) | valid_q[i]; |
| assign valid_popped[i] = (pop_fifo ? valid_pushed[i + 1] : valid_pushed[i]); |
| assign valid_d[i] = valid_popped[i] & ~clear_i; |
| assign entry_en[i] = (valid_pushed[i + 1] & pop_fifo) | ((in_valid_i & lowest_free_entry[i]) & ~pop_fifo); |
| assign rdata_d[i * 32+:32] = (valid_q[i + 1] ? rdata_q[(i + 1) * 32+:32] : in_rdata_i); |
| assign err_d[i] = (valid_q[i + 1] ? err_q[i + 1] : in_err_i); |
| end |
| endgenerate |
| assign lowest_free_entry[DEPTH - 1] = ~valid_q[DEPTH - 1] & valid_q[DEPTH - 2]; |
| assign valid_pushed[DEPTH - 1] = valid_q[DEPTH - 1] | (in_valid_i & lowest_free_entry[DEPTH - 1]); |
| assign valid_popped[DEPTH - 1] = (pop_fifo ? 1'b0 : valid_pushed[DEPTH - 1]); |
| assign valid_d[DEPTH - 1] = valid_popped[DEPTH - 1] & ~clear_i; |
| assign entry_en[DEPTH - 1] = in_valid_i & lowest_free_entry[DEPTH - 1]; |
| assign rdata_d[(DEPTH - 1) * 32+:32] = in_rdata_i; |
| assign err_d[DEPTH - 1] = in_err_i; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| valid_q <= {DEPTH {1'sb0}}; |
| else |
| valid_q <= valid_d; |
| generate |
| for (i = 0; i < DEPTH; i = i + 1) begin : g_fifo_regs |
| always @(posedge clk_i) |
| if (entry_en[i]) begin |
| rdata_q[i * 32+:32] <= rdata_d[i * 32+:32]; |
| err_q[i] <= err_d[i]; |
| end |
| end |
| endgenerate |
| endmodule |
| module brqrv_lsu ( |
| clk_i, |
| rst_ni, |
| data_req_o, |
| data_gnt_i, |
| data_rvalid_i, |
| data_err_i, |
| data_pmp_err_i, |
| data_addr_o, |
| data_we_o, |
| data_be_o, |
| data_wdata_o, |
| data_rdata_i, |
| lsu_we_i, |
| lsu_type_i, |
| lsu_wdata_i, |
| lsu_sign_ext_i, |
| lsu_rdata_o, |
| lsu_rdata_valid_o, |
| lsu_req_i, |
| adder_result_ex_i, |
| addr_incr_req_o, |
| addr_last_o, |
| lsu_req_done_o, |
| lsu_resp_valid_o, |
| load_err_o, |
| store_err_o, |
| busy_o, |
| perf_load_o, |
| perf_store_o |
| ); |
| input wire clk_i; |
| input wire rst_ni; |
| output reg data_req_o; |
| input wire data_gnt_i; |
| input wire data_rvalid_i; |
| input wire data_err_i; |
| input wire data_pmp_err_i; |
| output wire [31:0] data_addr_o; |
| output wire data_we_o; |
| output wire [3:0] data_be_o; |
| output wire [31:0] data_wdata_o; |
| input wire [31:0] data_rdata_i; |
| input wire lsu_we_i; |
| input wire [1:0] lsu_type_i; |
| input wire [31:0] lsu_wdata_i; |
| input wire lsu_sign_ext_i; |
| output wire [31:0] lsu_rdata_o; |
| output wire lsu_rdata_valid_o; |
| input wire lsu_req_i; |
| input wire [31:0] adder_result_ex_i; |
| output reg addr_incr_req_o; |
| output wire [31:0] addr_last_o; |
| output wire lsu_req_done_o; |
| output wire lsu_resp_valid_o; |
| output wire load_err_o; |
| output wire store_err_o; |
| output wire busy_o; |
| output reg perf_load_o; |
| output reg perf_store_o; |
| wire [31:0] data_addr; |
| wire [31:0] data_addr_w_aligned; |
| reg [31:0] addr_last_q; |
| reg addr_update; |
| reg ctrl_update; |
| reg rdata_update; |
| reg [31:8] rdata_q; |
| reg [1:0] rdata_offset_q; |
| reg [1:0] data_type_q; |
| reg data_sign_ext_q; |
| reg data_we_q; |
| wire [1:0] data_offset; |
| reg [3:0] data_be; |
| reg [31:0] data_wdata; |
| reg [31:0] data_rdata_ext; |
| reg [31:0] rdata_w_ext; |
| reg [31:0] rdata_h_ext; |
| reg [31:0] rdata_b_ext; |
| wire split_misaligned_access; |
| reg handle_misaligned_q; |
| reg handle_misaligned_d; |
| reg pmp_err_q; |
| reg pmp_err_d; |
| reg lsu_err_q; |
| reg lsu_err_d; |
| wire data_or_pmp_err; |
| reg [2:0] ls_fsm_cs; |
| reg [2:0] ls_fsm_ns; |
| assign data_addr = adder_result_ex_i; |
| assign data_offset = data_addr[1:0]; |
| always @(*) |
| case (lsu_type_i) |
| 2'b00: |
| if (!handle_misaligned_q) |
| case (data_offset) |
| 2'b00: data_be = 4'b1111; |
| 2'b01: data_be = 4'b1110; |
| 2'b10: data_be = 4'b1100; |
| 2'b11: data_be = 4'b1000; |
| default: data_be = 4'b1111; |
| endcase |
| else |
| case (data_offset) |
| 2'b00: data_be = 4'b0000; |
| 2'b01: data_be = 4'b0001; |
| 2'b10: data_be = 4'b0011; |
| 2'b11: data_be = 4'b0111; |
| default: data_be = 4'b1111; |
| endcase |
| 2'b01: |
| if (!handle_misaligned_q) |
| case (data_offset) |
| 2'b00: data_be = 4'b0011; |
| 2'b01: data_be = 4'b0110; |
| 2'b10: data_be = 4'b1100; |
| 2'b11: data_be = 4'b1000; |
| default: data_be = 4'b1111; |
| endcase |
| else |
| data_be = 4'b0001; |
| 2'b10, 2'b11: |
| case (data_offset) |
| 2'b00: data_be = 4'b0001; |
| 2'b01: data_be = 4'b0010; |
| 2'b10: data_be = 4'b0100; |
| 2'b11: data_be = 4'b1000; |
| default: data_be = 4'b1111; |
| endcase |
| default: data_be = 4'b1111; |
| endcase |
| always @(*) |
| case (data_offset) |
| 2'b00: data_wdata = lsu_wdata_i[31:0]; |
| 2'b01: data_wdata = {lsu_wdata_i[23:0], lsu_wdata_i[31:24]}; |
| 2'b10: data_wdata = {lsu_wdata_i[15:0], lsu_wdata_i[31:16]}; |
| 2'b11: data_wdata = {lsu_wdata_i[7:0], lsu_wdata_i[31:8]}; |
| default: data_wdata = lsu_wdata_i[31:0]; |
| endcase |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| rdata_q <= {24 {1'sb0}}; |
| else if (rdata_update) |
| rdata_q <= data_rdata_i[31:8]; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| rdata_offset_q <= 2'h0; |
| data_type_q <= 2'h0; |
| data_sign_ext_q <= 1'b0; |
| data_we_q <= 1'b0; |
| end |
| else if (ctrl_update) begin |
| rdata_offset_q <= data_offset; |
| data_type_q <= lsu_type_i; |
| data_sign_ext_q <= lsu_sign_ext_i; |
| data_we_q <= lsu_we_i; |
| end |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| addr_last_q <= {32 {1'sb0}}; |
| else if (addr_update) |
| addr_last_q <= data_addr; |
| always @(*) |
| case (rdata_offset_q) |
| 2'b00: rdata_w_ext = data_rdata_i[31:0]; |
| 2'b01: rdata_w_ext = {data_rdata_i[7:0], rdata_q[31:8]}; |
| 2'b10: rdata_w_ext = {data_rdata_i[15:0], rdata_q[31:16]}; |
| 2'b11: rdata_w_ext = {data_rdata_i[23:0], rdata_q[31:24]}; |
| default: rdata_w_ext = data_rdata_i[31:0]; |
| endcase |
| always @(*) |
| case (rdata_offset_q) |
| 2'b00: |
| if (!data_sign_ext_q) |
| rdata_h_ext = {16'h0000, data_rdata_i[15:0]}; |
| else |
| rdata_h_ext = {{16 {data_rdata_i[15]}}, data_rdata_i[15:0]}; |
| 2'b01: |
| if (!data_sign_ext_q) |
| rdata_h_ext = {16'h0000, data_rdata_i[23:8]}; |
| else |
| rdata_h_ext = {{16 {data_rdata_i[23]}}, data_rdata_i[23:8]}; |
| 2'b10: |
| if (!data_sign_ext_q) |
| rdata_h_ext = {16'h0000, data_rdata_i[31:16]}; |
| else |
| rdata_h_ext = {{16 {data_rdata_i[31]}}, data_rdata_i[31:16]}; |
| 2'b11: |
| if (!data_sign_ext_q) |
| rdata_h_ext = {16'h0000, data_rdata_i[7:0], rdata_q[31:24]}; |
| else |
| rdata_h_ext = {{16 {data_rdata_i[7]}}, data_rdata_i[7:0], rdata_q[31:24]}; |
| default: rdata_h_ext = {16'h0000, data_rdata_i[15:0]}; |
| endcase |
| always @(*) |
| case (rdata_offset_q) |
| 2'b00: |
| if (!data_sign_ext_q) |
| rdata_b_ext = {24'h000000, data_rdata_i[7:0]}; |
| else |
| rdata_b_ext = {{24 {data_rdata_i[7]}}, data_rdata_i[7:0]}; |
| 2'b01: |
| if (!data_sign_ext_q) |
| rdata_b_ext = {24'h000000, data_rdata_i[15:8]}; |
| else |
| rdata_b_ext = {{24 {data_rdata_i[15]}}, data_rdata_i[15:8]}; |
| 2'b10: |
| if (!data_sign_ext_q) |
| rdata_b_ext = {24'h000000, data_rdata_i[23:16]}; |
| else |
| rdata_b_ext = {{24 {data_rdata_i[23]}}, data_rdata_i[23:16]}; |
| 2'b11: |
| if (!data_sign_ext_q) |
| rdata_b_ext = {24'h000000, data_rdata_i[31:24]}; |
| else |
| rdata_b_ext = {{24 {data_rdata_i[31]}}, data_rdata_i[31:24]}; |
| default: rdata_b_ext = {24'h000000, data_rdata_i[7:0]}; |
| endcase |
| always @(*) |
| case (data_type_q) |
| 2'b00: data_rdata_ext = rdata_w_ext; |
| 2'b01: data_rdata_ext = rdata_h_ext; |
| 2'b10, 2'b11: data_rdata_ext = rdata_b_ext; |
| default: data_rdata_ext = rdata_w_ext; |
| endcase |
| assign split_misaligned_access = ((lsu_type_i == 2'b00) && (data_offset != 2'b00)) || ((lsu_type_i == 2'b01) && (data_offset == 2'b11)); |
| localparam [2:0] IDLE = 0; |
| localparam [2:0] WAIT_GNT = 3; |
| localparam [2:0] WAIT_GNT_MIS = 1; |
| localparam [2:0] WAIT_RVALID_MIS = 2; |
| localparam [2:0] WAIT_RVALID_MIS_GNTS_DONE = 4; |
| always @(*) begin |
| ls_fsm_ns = ls_fsm_cs; |
| data_req_o = 1'b0; |
| addr_incr_req_o = 1'b0; |
| handle_misaligned_d = handle_misaligned_q; |
| pmp_err_d = pmp_err_q; |
| lsu_err_d = lsu_err_q; |
| addr_update = 1'b0; |
| ctrl_update = 1'b0; |
| rdata_update = 1'b0; |
| perf_load_o = 1'b0; |
| perf_store_o = 1'b0; |
| case (ls_fsm_cs) |
| IDLE: begin |
| pmp_err_d = 1'b0; |
| if (lsu_req_i) begin |
| data_req_o = 1'b1; |
| pmp_err_d = data_pmp_err_i; |
| lsu_err_d = 1'b0; |
| perf_load_o = ~lsu_we_i; |
| perf_store_o = lsu_we_i; |
| if (data_gnt_i) begin |
| ctrl_update = 1'b1; |
| addr_update = 1'b1; |
| handle_misaligned_d = split_misaligned_access; |
| ls_fsm_ns = (split_misaligned_access ? WAIT_RVALID_MIS : IDLE); |
| end |
| else |
| ls_fsm_ns = (split_misaligned_access ? WAIT_GNT_MIS : WAIT_GNT); |
| end |
| end |
| WAIT_GNT_MIS: begin |
| data_req_o = 1'b1; |
| if (data_gnt_i || pmp_err_q) begin |
| addr_update = 1'b1; |
| ctrl_update = 1'b1; |
| handle_misaligned_d = 1'b1; |
| ls_fsm_ns = WAIT_RVALID_MIS; |
| end |
| end |
| WAIT_RVALID_MIS: begin |
| data_req_o = 1'b1; |
| addr_incr_req_o = 1'b1; |
| if (data_rvalid_i || pmp_err_q) begin |
| pmp_err_d = data_pmp_err_i; |
| lsu_err_d = data_err_i | pmp_err_q; |
| rdata_update = ~data_we_q; |
| ls_fsm_ns = (data_gnt_i ? IDLE : WAIT_GNT); |
| addr_update = data_gnt_i & ~(data_err_i | pmp_err_q); |
| handle_misaligned_d = ~data_gnt_i; |
| end |
| else if (data_gnt_i) begin |
| ls_fsm_ns = WAIT_RVALID_MIS_GNTS_DONE; |
| handle_misaligned_d = 1'b0; |
| end |
| end |
| WAIT_GNT: begin |
| addr_incr_req_o = handle_misaligned_q; |
| data_req_o = 1'b1; |
| if (data_gnt_i || pmp_err_q) begin |
| ctrl_update = 1'b1; |
| addr_update = ~lsu_err_q; |
| ls_fsm_ns = IDLE; |
| handle_misaligned_d = 1'b0; |
| end |
| end |
| WAIT_RVALID_MIS_GNTS_DONE: begin |
| addr_incr_req_o = 1'b1; |
| if (data_rvalid_i) begin |
| pmp_err_d = data_pmp_err_i; |
| lsu_err_d = data_err_i; |
| addr_update = ~data_err_i; |
| rdata_update = ~data_we_q; |
| ls_fsm_ns = IDLE; |
| end |
| end |
| default: ls_fsm_ns = IDLE; |
| endcase |
| end |
| assign lsu_req_done_o = (lsu_req_i | (ls_fsm_cs != IDLE)) & (ls_fsm_ns == IDLE); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| ls_fsm_cs <= IDLE; |
| handle_misaligned_q <= 1'sb0; |
| pmp_err_q <= 1'sb0; |
| lsu_err_q <= 1'sb0; |
| end |
| else begin |
| ls_fsm_cs <= ls_fsm_ns; |
| handle_misaligned_q <= handle_misaligned_d; |
| pmp_err_q <= pmp_err_d; |
| lsu_err_q <= lsu_err_d; |
| end |
| assign data_or_pmp_err = (lsu_err_q | data_err_i) | pmp_err_q; |
| assign lsu_resp_valid_o = (data_rvalid_i | pmp_err_q) & (ls_fsm_cs == IDLE); |
| assign lsu_rdata_valid_o = (((ls_fsm_cs == IDLE) & data_rvalid_i) & ~data_or_pmp_err) & ~data_we_q; |
| assign lsu_rdata_o = data_rdata_ext; |
| assign data_addr_w_aligned = {data_addr[31:2], 2'b00}; |
| assign data_addr_o = data_addr_w_aligned; |
| assign data_wdata_o = data_wdata; |
| assign data_we_o = lsu_we_i; |
| assign data_be_o = data_be; |
| assign addr_last_o = addr_last_q; |
| assign load_err_o = (data_or_pmp_err & ~data_we_q) & lsu_resp_valid_o; |
| assign store_err_o = (data_or_pmp_err & data_we_q) & lsu_resp_valid_o; |
| assign busy_o = ls_fsm_cs != IDLE; |
| endmodule |
| module brqrv_pmp ( |
| clk_i, |
| rst_ni, |
| csr_pmp_cfg_i, |
| csr_pmp_addr_i, |
| priv_mode_i, |
| pmp_req_addr_i, |
| pmp_req_type_i, |
| pmp_req_err_o |
| ); |
| parameter [31:0] PMPGranularity = 0; |
| parameter [31:0] PMPNumChan = 2; |
| parameter [31:0] PMPNumRegions = 4; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire [(0 >= (PMPNumRegions - 1) ? ((2 - PMPNumRegions) * 6) + (((PMPNumRegions - 1) * 6) - 1) : (PMPNumRegions * 6) - 1):(0 >= (PMPNumRegions - 1) ? (PMPNumRegions - 1) * 6 : 0)] csr_pmp_cfg_i; |
| input wire [(0 >= (PMPNumRegions - 1) ? ((2 - PMPNumRegions) * 34) + (((PMPNumRegions - 1) * 34) - 1) : (PMPNumRegions * 34) - 1):(0 >= (PMPNumRegions - 1) ? (PMPNumRegions - 1) * 34 : 0)] csr_pmp_addr_i; |
| input wire [(0 >= (PMPNumChan - 1) ? ((2 - PMPNumChan) * 2) + (((PMPNumChan - 1) * 2) - 1) : (PMPNumChan * 2) - 1):(0 >= (PMPNumChan - 1) ? (PMPNumChan - 1) * 2 : 0)] priv_mode_i; |
| input wire [(0 >= (PMPNumChan - 1) ? ((2 - PMPNumChan) * 34) + (((PMPNumChan - 1) * 34) - 1) : (PMPNumChan * 34) - 1):(0 >= (PMPNumChan - 1) ? (PMPNumChan - 1) * 34 : 0)] pmp_req_addr_i; |
| input wire [(0 >= (PMPNumChan - 1) ? ((2 - PMPNumChan) * 2) + (((PMPNumChan - 1) * 2) - 1) : (PMPNumChan * 2) - 1):(0 >= (PMPNumChan - 1) ? (PMPNumChan - 1) * 2 : 0)] pmp_req_type_i; |
| output wire [PMPNumChan - 1:0] pmp_req_err_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| wire [33:0] region_start_addr [0:PMPNumRegions - 1]; |
| wire [33:PMPGranularity + 2] region_addr_mask [0:PMPNumRegions - 1]; |
| wire [(PMPNumChan * PMPNumRegions) - 1:0] region_match_gt; |
| wire [(PMPNumChan * PMPNumRegions) - 1:0] region_match_lt; |
| wire [(PMPNumChan * PMPNumRegions) - 1:0] region_match_eq; |
| reg [(PMPNumChan * PMPNumRegions) - 1:0] region_match_all; |
| wire [(PMPNumChan * PMPNumRegions) - 1:0] region_perm_check; |
| reg [PMPNumChan - 1:0] access_fault; |
| generate |
| genvar r; |
| for (r = 0; r < PMPNumRegions; r = r + 1) begin : g_addr_exp |
| if (r == 0) begin : g_entry0 |
| assign region_start_addr[r] = (csr_pmp_cfg_i[((0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 6) + 4-:2] == PMP_MODE_TOR ? 34'h000000000 : csr_pmp_addr_i[(0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 34+:34]); |
| end |
| else begin : g_oth |
| assign region_start_addr[r] = (csr_pmp_cfg_i[((0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 6) + 4-:2] == PMP_MODE_TOR ? csr_pmp_addr_i[(0 >= (PMPNumRegions - 1) ? r - 1 : (PMPNumRegions - 1) - (r - 1)) * 34+:34] : csr_pmp_addr_i[(0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 34+:34]); |
| end |
| genvar b; |
| for (b = PMPGranularity + 2; b < 34; b = b + 1) begin : g_bitmask |
| if (b == (PMPGranularity + 2)) begin : g_bit0 |
| assign region_addr_mask[r][b] = csr_pmp_cfg_i[((0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 6) + 4-:2] != PMP_MODE_NAPOT; |
| end |
| else begin : g_others |
| assign region_addr_mask[r][b] = (csr_pmp_cfg_i[((0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 6) + 4-:2] != PMP_MODE_NAPOT) | ~&csr_pmp_addr_i[((0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 34) + ((b - 1) >= (PMPGranularity + 2) ? b - 1 : ((b - 1) + ((b - 1) >= (PMPGranularity + 2) ? ((b - 1) - (PMPGranularity + 2)) + 1 : ((PMPGranularity + 2) - (b - 1)) + 1)) - 1)-:((b - 1) >= (PMPGranularity + 2) ? ((b - 1) - (PMPGranularity + 2)) + 1 : ((PMPGranularity + 2) - (b - 1)) + 1)]; |
| end |
| end |
| end |
| endgenerate |
| generate |
| genvar c; |
| for (c = 0; c < PMPNumChan; c = c + 1) begin : g_access_check |
| for (r = 0; r < PMPNumRegions; r = r + 1) begin : g_regions |
| assign region_match_eq[(c * PMPNumRegions) + r] = (pmp_req_addr_i[((0 >= (PMPNumChan - 1) ? c : (PMPNumChan - 1) - c) * 34) + (33 >= (PMPGranularity + 2) ? 33 : (33 + (33 >= (PMPGranularity + 2) ? 34 - (PMPGranularity + 2) : PMPGranularity - 30)) - 1)-:(33 >= (PMPGranularity + 2) ? 34 - (PMPGranularity + 2) : PMPGranularity - 30)] & region_addr_mask[r]) == (region_start_addr[r][33:PMPGranularity + 2] & region_addr_mask[r]); |
| assign region_match_gt[(c * PMPNumRegions) + r] = pmp_req_addr_i[((0 >= (PMPNumChan - 1) ? c : (PMPNumChan - 1) - c) * 34) + (33 >= (PMPGranularity + 2) ? 33 : (33 + (33 >= (PMPGranularity + 2) ? 34 - (PMPGranularity + 2) : PMPGranularity - 30)) - 1)-:(33 >= (PMPGranularity + 2) ? 34 - (PMPGranularity + 2) : PMPGranularity - 30)] > region_start_addr[r][33:PMPGranularity + 2]; |
| assign region_match_lt[(c * PMPNumRegions) + r] = pmp_req_addr_i[((0 >= (PMPNumChan - 1) ? c : (PMPNumChan - 1) - c) * 34) + (33 >= (PMPGranularity + 2) ? 33 : (33 + (33 >= (PMPGranularity + 2) ? 34 - (PMPGranularity + 2) : PMPGranularity - 30)) - 1)-:(33 >= (PMPGranularity + 2) ? 34 - (PMPGranularity + 2) : PMPGranularity - 30)] < csr_pmp_addr_i[((0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 34) + (33 >= (PMPGranularity + 2) ? 33 : (33 + (33 >= (PMPGranularity + 2) ? 34 - (PMPGranularity + 2) : PMPGranularity - 30)) - 1)-:(33 >= (PMPGranularity + 2) ? 34 - (PMPGranularity + 2) : PMPGranularity - 30)]; |
| always @(*) begin |
| region_match_all[(c * PMPNumRegions) + r] = 1'b0; |
| case (csr_pmp_cfg_i[((0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 6) + 4-:2]) |
| PMP_MODE_OFF: region_match_all[(c * PMPNumRegions) + r] = 1'b0; |
| PMP_MODE_NA4: region_match_all[(c * PMPNumRegions) + r] = region_match_eq[(c * PMPNumRegions) + r]; |
| PMP_MODE_NAPOT: region_match_all[(c * PMPNumRegions) + r] = region_match_eq[(c * PMPNumRegions) + r]; |
| PMP_MODE_TOR: region_match_all[(c * PMPNumRegions) + r] = (region_match_eq[(c * PMPNumRegions) + r] | region_match_gt[(c * PMPNumRegions) + r]) & region_match_lt[(c * PMPNumRegions) + r]; |
| default: region_match_all[(c * PMPNumRegions) + r] = 1'b0; |
| endcase |
| end |
| assign region_perm_check[(c * PMPNumRegions) + r] = (((pmp_req_type_i[(0 >= (PMPNumChan - 1) ? c : (PMPNumChan - 1) - c) * 2+:2] == PMP_ACC_EXEC) & csr_pmp_cfg_i[((0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 6) + 2]) | ((pmp_req_type_i[(0 >= (PMPNumChan - 1) ? c : (PMPNumChan - 1) - c) * 2+:2] == PMP_ACC_WRITE) & csr_pmp_cfg_i[((0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 6) + 1])) | ((pmp_req_type_i[(0 >= (PMPNumChan - 1) ? c : (PMPNumChan - 1) - c) * 2+:2] == PMP_ACC_READ) & csr_pmp_cfg_i[(0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 6]); |
| end |
| always @(*) begin |
| access_fault[c] = priv_mode_i[(0 >= (PMPNumChan - 1) ? c : (PMPNumChan - 1) - c) * 2+:2] != PRIV_LVL_M; |
| begin : sv2v_autoblock_69 |
| reg signed [31:0] r; |
| for (r = PMPNumRegions - 1; r >= 0; r = r - 1) |
| if (region_match_all[(c * PMPNumRegions) + r]) |
| access_fault[c] = (priv_mode_i[(0 >= (PMPNumChan - 1) ? c : (PMPNumChan - 1) - c) * 2+:2] == PRIV_LVL_M ? csr_pmp_cfg_i[((0 >= (PMPNumRegions - 1) ? r : (PMPNumRegions - 1) - r) * 6) + 5] & ~region_perm_check[(c * PMPNumRegions) + r] : ~region_perm_check[(c * PMPNumRegions) + r]); |
| end |
| end |
| assign pmp_req_err_o[c] = access_fault[c]; |
| end |
| endgenerate |
| endmodule |
| module brqrv_register_file_ff ( |
| clk_i, |
| rst_ni, |
| test_en_i, |
| dummy_instr_id_i, |
| raddr_a_i, |
| rdata_a_o, |
| raddr_b_i, |
| rdata_b_o, |
| waddr_a_i, |
| wdata_a_i, |
| we_a_i |
| ); |
| parameter [0:0] RV32E = 0; |
| parameter [31:0] DataWidth = 32; |
| parameter [0:0] DummyInstructions = 0; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire test_en_i; |
| input wire dummy_instr_id_i; |
| input wire [4:0] raddr_a_i; |
| output wire [DataWidth - 1:0] rdata_a_o; |
| input wire [4:0] raddr_b_i; |
| output wire [DataWidth - 1:0] rdata_b_o; |
| input wire [4:0] waddr_a_i; |
| input wire [DataWidth - 1:0] wdata_a_i; |
| input wire we_a_i; |
| localparam [31:0] ADDR_WIDTH = (RV32E ? 4 : 5); |
| localparam [31:0] NUM_WORDS = 2 ** ADDR_WIDTH; |
| wire [(NUM_WORDS * DataWidth) - 1:0] rf_reg; |
| reg [((NUM_WORDS - 1) >= 1 ? ((NUM_WORDS - 1) * DataWidth) + (DataWidth - 1) : ((3 - NUM_WORDS) * DataWidth) + (((NUM_WORDS - 1) * DataWidth) - 1)):((NUM_WORDS - 1) >= 1 ? DataWidth : (NUM_WORDS - 1) * DataWidth)] rf_reg_q; |
| reg [NUM_WORDS - 1:1] we_a_dec; |
| function automatic [4:0] sv2v_cast_5_unsigned; |
| input reg [4:0] inp; |
| sv2v_cast_5_unsigned = inp; |
| endfunction |
| always @(*) begin : we_a_decoder |
| begin : sv2v_autoblock_70 |
| reg [31:0] i; |
| for (i = 1; i < NUM_WORDS; i = i + 1) |
| we_a_dec[i] = (waddr_a_i == sv2v_cast_5_unsigned(i) ? we_a_i : 1'b0); |
| end |
| end |
| generate |
| genvar i; |
| for (i = 1; i < NUM_WORDS; i = i + 1) begin : g_rf_flops |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| rf_reg_q[((NUM_WORDS - 1) >= 1 ? i : 1 - (i - (NUM_WORDS - 1))) * DataWidth+:DataWidth] <= {DataWidth {1'sb0}}; |
| else if (we_a_dec[i]) |
| rf_reg_q[((NUM_WORDS - 1) >= 1 ? i : 1 - (i - (NUM_WORDS - 1))) * DataWidth+:DataWidth] <= wdata_a_i; |
| end |
| endgenerate |
| generate |
| if (DummyInstructions) begin : g_dummy_r0 |
| wire we_r0_dummy; |
| reg [DataWidth - 1:0] rf_r0_q; |
| assign we_r0_dummy = we_a_i & dummy_instr_id_i; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| rf_r0_q <= {DataWidth {1'sb0}}; |
| else if (we_r0_dummy) |
| rf_r0_q <= wdata_a_i; |
| assign rf_reg[0+:DataWidth] = (dummy_instr_id_i ? rf_r0_q : {DataWidth {1'sb0}}); |
| end |
| else begin : g_normal_r0 |
| wire unused_dummy_instr_id; |
| assign unused_dummy_instr_id = dummy_instr_id_i; |
| assign rf_reg[0+:DataWidth] = {DataWidth {1'sb0}}; |
| end |
| endgenerate |
| assign rf_reg[DataWidth * (((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : ((NUM_WORDS - 1) + ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)) - 1) - (((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS) - 1))+:DataWidth * ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)] = rf_reg_q[DataWidth * ((NUM_WORDS - 1) >= 1 ? ((NUM_WORDS - 1) >= 1 ? ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : ((NUM_WORDS - 1) + ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)) - 1) - (((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS) - 1) : ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : ((NUM_WORDS - 1) + ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)) - 1)) : 1 - (((NUM_WORDS - 1) >= 1 ? ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : ((NUM_WORDS - 1) + ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)) - 1) - (((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS) - 1) : ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : ((NUM_WORDS - 1) + ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)) - 1)) - (NUM_WORDS - 1)))+:DataWidth * ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)]; |
| assign rdata_a_o = rf_reg[raddr_a_i * DataWidth+:DataWidth]; |
| assign rdata_b_o = rf_reg[raddr_b_i * DataWidth+:DataWidth]; |
| endmodule |
| module brqrv_register_file_fpga ( |
| clk_i, |
| rst_ni, |
| test_en_i, |
| dummy_instr_id_i, |
| raddr_a_i, |
| rdata_a_o, |
| raddr_b_i, |
| rdata_b_o, |
| waddr_a_i, |
| wdata_a_i, |
| we_a_i |
| ); |
| parameter [0:0] RV32E = 0; |
| parameter [31:0] DataWidth = 32; |
| parameter [0:0] DummyInstructions = 0; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire test_en_i; |
| input wire dummy_instr_id_i; |
| input wire [4:0] raddr_a_i; |
| output wire [DataWidth - 1:0] rdata_a_o; |
| input wire [4:0] raddr_b_i; |
| output wire [DataWidth - 1:0] rdata_b_o; |
| input wire [4:0] waddr_a_i; |
| input wire [DataWidth - 1:0] wdata_a_i; |
| input wire we_a_i; |
| localparam signed [31:0] ADDR_WIDTH = (RV32E ? 4 : 5); |
| localparam signed [31:0] NUM_WORDS = 2 ** ADDR_WIDTH; |
| reg [DataWidth - 1:0] mem [0:NUM_WORDS - 1]; |
| wire we; |
| assign rdata_a_o = (raddr_a_i == {5 {1'sb0}} ? {DataWidth {1'sb0}} : mem[raddr_a_i]); |
| assign rdata_b_o = (raddr_b_i == {5 {1'sb0}} ? {DataWidth {1'sb0}} : mem[raddr_b_i]); |
| assign we = (waddr_a_i == {5 {1'sb0}} ? 1'b0 : we_a_i); |
| always @(posedge clk_i) begin : sync_write |
| if (we == 1'b1) |
| mem[waddr_a_i] <= wdata_a_i; |
| end |
| wire unused_rst_ni; |
| assign unused_rst_ni = rst_ni; |
| wire unused_dummy_instr; |
| assign unused_dummy_instr = dummy_instr_id_i; |
| endmodule |
| module brqrv_wbu ( |
| clk_i, |
| rst_ni, |
| en_wb_i, |
| instr_type_wb_i, |
| pc_id_i, |
| ready_wb_o, |
| rf_write_wb_o, |
| outstanding_load_wb_o, |
| outstanding_store_wb_o, |
| pc_wb_o, |
| rf_waddr_id_i, |
| rf_wdata_id_i, |
| rf_we_id_i, |
| rf_wdata_lsu_i, |
| rf_we_lsu_i, |
| rf_wdata_fwd_wb_o, |
| rf_waddr_wb_o, |
| rf_wdata_wb_o, |
| rf_we_wb_o, |
| lsu_resp_valid_i, |
| instr_done_wb_o |
| ); |
| parameter [0:0] WritebackStage = 1'b0; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire en_wb_i; |
| input wire [1:0] instr_type_wb_i; |
| input wire [31:0] pc_id_i; |
| output wire ready_wb_o; |
| output wire rf_write_wb_o; |
| output wire outstanding_load_wb_o; |
| output wire outstanding_store_wb_o; |
| output wire [31:0] pc_wb_o; |
| input wire [4:0] rf_waddr_id_i; |
| input wire [31:0] rf_wdata_id_i; |
| input wire rf_we_id_i; |
| input wire [31:0] rf_wdata_lsu_i; |
| input wire rf_we_lsu_i; |
| output wire [31:0] rf_wdata_fwd_wb_o; |
| output wire [4:0] rf_waddr_wb_o; |
| output wire [31:0] rf_wdata_wb_o; |
| output wire rf_we_wb_o; |
| input wire lsu_resp_valid_i; |
| output wire instr_done_wb_o; |
| localparam integer RegFileFF = 0; |
| localparam integer RegFileFPGA = 1; |
| localparam integer RegFileLatch = 2; |
| localparam integer RV32MNone = 0; |
| localparam integer RV32MSlow = 1; |
| localparam integer RV32MFast = 2; |
| localparam integer RV32MSingleCycle = 3; |
| localparam integer RV32BNone = 0; |
| localparam integer RV32BBalanced = 1; |
| localparam integer RV32BFull = 2; |
| localparam [6:0] OPCODE_LOAD = 7'h03; |
| localparam [6:0] OPCODE_MISC_MEM = 7'h0f; |
| localparam [6:0] OPCODE_OP_IMM = 7'h13; |
| localparam [6:0] OPCODE_AUIPC = 7'h17; |
| localparam [6:0] OPCODE_STORE = 7'h23; |
| localparam [6:0] OPCODE_OP = 7'h33; |
| localparam [6:0] OPCODE_LUI = 7'h37; |
| localparam [6:0] OPCODE_BRANCH = 7'h63; |
| localparam [6:0] OPCODE_JALR = 7'h67; |
| localparam [6:0] OPCODE_JAL = 7'h6f; |
| localparam [6:0] OPCODE_SYSTEM = 7'h73; |
| localparam [5:0] ALU_ADD = 0; |
| localparam [5:0] ALU_SUB = 1; |
| localparam [5:0] ALU_XOR = 2; |
| localparam [5:0] ALU_OR = 3; |
| localparam [5:0] ALU_AND = 4; |
| localparam [5:0] ALU_XNOR = 5; |
| localparam [5:0] ALU_ORN = 6; |
| localparam [5:0] ALU_ANDN = 7; |
| localparam [5:0] ALU_SRA = 8; |
| localparam [5:0] ALU_SRL = 9; |
| localparam [5:0] ALU_SLL = 10; |
| localparam [5:0] ALU_SRO = 11; |
| localparam [5:0] ALU_SLO = 12; |
| localparam [5:0] ALU_ROR = 13; |
| localparam [5:0] ALU_ROL = 14; |
| localparam [5:0] ALU_GREV = 15; |
| localparam [5:0] ALU_GORC = 16; |
| localparam [5:0] ALU_SHFL = 17; |
| localparam [5:0] ALU_UNSHFL = 18; |
| localparam [5:0] ALU_LT = 19; |
| localparam [5:0] ALU_LTU = 20; |
| localparam [5:0] ALU_GE = 21; |
| localparam [5:0] ALU_GEU = 22; |
| localparam [5:0] ALU_EQ = 23; |
| localparam [5:0] ALU_NE = 24; |
| localparam [5:0] ALU_MIN = 25; |
| localparam [5:0] ALU_MINU = 26; |
| localparam [5:0] ALU_MAX = 27; |
| localparam [5:0] ALU_MAXU = 28; |
| localparam [5:0] ALU_PACK = 29; |
| localparam [5:0] ALU_PACKU = 30; |
| localparam [5:0] ALU_PACKH = 31; |
| localparam [5:0] ALU_SEXTB = 32; |
| localparam [5:0] ALU_SEXTH = 33; |
| localparam [5:0] ALU_CLZ = 34; |
| localparam [5:0] ALU_CTZ = 35; |
| localparam [5:0] ALU_PCNT = 36; |
| localparam [5:0] ALU_SLT = 37; |
| localparam [5:0] ALU_SLTU = 38; |
| localparam [5:0] ALU_CMOV = 39; |
| localparam [5:0] ALU_CMIX = 40; |
| localparam [5:0] ALU_FSL = 41; |
| localparam [5:0] ALU_FSR = 42; |
| localparam [5:0] ALU_SBSET = 43; |
| localparam [5:0] ALU_SBCLR = 44; |
| localparam [5:0] ALU_SBINV = 45; |
| localparam [5:0] ALU_SBEXT = 46; |
| localparam [5:0] ALU_BEXT = 47; |
| localparam [5:0] ALU_BDEP = 48; |
| localparam [5:0] ALU_BFP = 49; |
| localparam [5:0] ALU_CLMUL = 50; |
| localparam [5:0] ALU_CLMULR = 51; |
| localparam [5:0] ALU_CLMULH = 52; |
| localparam [5:0] ALU_CRC32_B = 53; |
| localparam [5:0] ALU_CRC32C_B = 54; |
| localparam [5:0] ALU_CRC32_H = 55; |
| localparam [5:0] ALU_CRC32C_H = 56; |
| localparam [5:0] ALU_CRC32_W = 57; |
| localparam [5:0] ALU_CRC32C_W = 58; |
| localparam [1:0] MD_OP_MULL = 0; |
| localparam [1:0] MD_OP_MULH = 1; |
| localparam [1:0] MD_OP_DIV = 2; |
| localparam [1:0] MD_OP_REM = 3; |
| localparam [1:0] CSR_OP_READ = 0; |
| localparam [1:0] CSR_OP_WRITE = 1; |
| localparam [1:0] CSR_OP_SET = 2; |
| localparam [1:0] CSR_OP_CLEAR = 3; |
| localparam [1:0] PRIV_LVL_M = 2'b11; |
| localparam [1:0] PRIV_LVL_H = 2'b10; |
| localparam [1:0] PRIV_LVL_S = 2'b01; |
| localparam [1:0] PRIV_LVL_U = 2'b00; |
| localparam [3:0] XDEBUGVER_NO = 4'd0; |
| localparam [3:0] XDEBUGVER_STD = 4'd4; |
| localparam [3:0] XDEBUGVER_NONSTD = 4'd15; |
| localparam [1:0] WB_INSTR_LOAD = 0; |
| localparam [1:0] WB_INSTR_STORE = 1; |
| localparam [1:0] WB_INSTR_OTHER = 2; |
| localparam [1:0] OP_A_REG_A = 0; |
| localparam [1:0] OP_A_FWD = 1; |
| localparam [1:0] OP_A_CURRPC = 2; |
| localparam [1:0] OP_A_IMM = 3; |
| localparam [0:0] IMM_A_Z = 0; |
| localparam [0:0] IMM_A_ZERO = 1; |
| localparam [0:0] OP_B_REG_B = 0; |
| localparam [0:0] OP_B_IMM = 1; |
| localparam [2:0] IMM_B_I = 0; |
| localparam [2:0] IMM_B_S = 1; |
| localparam [2:0] IMM_B_B = 2; |
| localparam [2:0] IMM_B_U = 3; |
| localparam [2:0] IMM_B_J = 4; |
| localparam [2:0] IMM_B_INCR_PC = 5; |
| localparam [2:0] IMM_B_INCR_ADDR = 6; |
| localparam [0:0] RF_WD_EX = 0; |
| localparam [0:0] RF_WD_CSR = 1; |
| localparam [2:0] PC_BOOT = 0; |
| localparam [2:0] PC_JUMP = 1; |
| localparam [2:0] PC_EXC = 2; |
| localparam [2:0] PC_ERET = 3; |
| localparam [2:0] PC_DRET = 4; |
| localparam [2:0] PC_BP = 5; |
| localparam [1:0] EXC_PC_EXC = 0; |
| localparam [1:0] EXC_PC_IRQ = 1; |
| localparam [1:0] EXC_PC_DBD = 2; |
| localparam [1:0] EXC_PC_DBG_EXC = 3; |
| localparam [5:0] EXC_CAUSE_IRQ_SOFTWARE_M = {1'b1, 5'd3}; |
| localparam [5:0] EXC_CAUSE_IRQ_TIMER_M = {1'b1, 5'd7}; |
| localparam [5:0] EXC_CAUSE_IRQ_EXTERNAL_M = {1'b1, 5'd11}; |
| localparam [5:0] EXC_CAUSE_IRQ_NM = {1'b1, 5'd31}; |
| localparam [5:0] EXC_CAUSE_INSN_ADDR_MISA = {1'b0, 5'd0}; |
| localparam [5:0] EXC_CAUSE_INSTR_ACCESS_FAULT = {1'b0, 5'd1}; |
| localparam [5:0] EXC_CAUSE_ILLEGAL_INSN = {1'b0, 5'd2}; |
| localparam [5:0] EXC_CAUSE_BREAKPOINT = {1'b0, 5'd3}; |
| localparam [5:0] EXC_CAUSE_LOAD_ACCESS_FAULT = {1'b0, 5'd5}; |
| localparam [5:0] EXC_CAUSE_STORE_ACCESS_FAULT = {1'b0, 5'd7}; |
| localparam [5:0] EXC_CAUSE_ECALL_UMODE = {1'b0, 5'd8}; |
| localparam [5:0] EXC_CAUSE_ECALL_MMODE = {1'b0, 5'd11}; |
| localparam [2:0] DBG_CAUSE_NONE = 3'h0; |
| localparam [2:0] DBG_CAUSE_EBREAK = 3'h1; |
| localparam [2:0] DBG_CAUSE_TRIGGER = 3'h2; |
| localparam [2:0] DBG_CAUSE_HALTREQ = 3'h3; |
| localparam [2:0] DBG_CAUSE_STEP = 3'h4; |
| localparam [31:0] PMP_MAX_REGIONS = 16; |
| localparam [31:0] PMP_CFG_W = 8; |
| localparam [31:0] PMP_I = 0; |
| localparam [31:0] PMP_D = 1; |
| localparam [1:0] PMP_ACC_EXEC = 2'b00; |
| localparam [1:0] PMP_ACC_WRITE = 2'b01; |
| localparam [1:0] PMP_ACC_READ = 2'b10; |
| localparam [1:0] PMP_MODE_OFF = 2'b00; |
| localparam [1:0] PMP_MODE_TOR = 2'b01; |
| localparam [1:0] PMP_MODE_NA4 = 2'b10; |
| localparam [1:0] PMP_MODE_NAPOT = 2'b11; |
| localparam [11:0] CSR_MHARTID = 12'hf14; |
| localparam [11:0] CSR_MSTATUS = 12'h300; |
| localparam [11:0] CSR_MISA = 12'h301; |
| localparam [11:0] CSR_MIE = 12'h304; |
| localparam [11:0] CSR_MTVEC = 12'h305; |
| localparam [11:0] CSR_MSCRATCH = 12'h340; |
| localparam [11:0] CSR_MEPC = 12'h341; |
| localparam [11:0] CSR_MCAUSE = 12'h342; |
| localparam [11:0] CSR_MTVAL = 12'h343; |
| localparam [11:0] CSR_MIP = 12'h344; |
| localparam [11:0] CSR_PMPCFG0 = 12'h3a0; |
| localparam [11:0] CSR_PMPCFG1 = 12'h3a1; |
| localparam [11:0] CSR_PMPCFG2 = 12'h3a2; |
| localparam [11:0] CSR_PMPCFG3 = 12'h3a3; |
| localparam [11:0] CSR_PMPADDR0 = 12'h3b0; |
| localparam [11:0] CSR_PMPADDR1 = 12'h3b1; |
| localparam [11:0] CSR_PMPADDR2 = 12'h3b2; |
| localparam [11:0] CSR_PMPADDR3 = 12'h3b3; |
| localparam [11:0] CSR_PMPADDR4 = 12'h3b4; |
| localparam [11:0] CSR_PMPADDR5 = 12'h3b5; |
| localparam [11:0] CSR_PMPADDR6 = 12'h3b6; |
| localparam [11:0] CSR_PMPADDR7 = 12'h3b7; |
| localparam [11:0] CSR_PMPADDR8 = 12'h3b8; |
| localparam [11:0] CSR_PMPADDR9 = 12'h3b9; |
| localparam [11:0] CSR_PMPADDR10 = 12'h3ba; |
| localparam [11:0] CSR_PMPADDR11 = 12'h3bb; |
| localparam [11:0] CSR_PMPADDR12 = 12'h3bc; |
| localparam [11:0] CSR_PMPADDR13 = 12'h3bd; |
| localparam [11:0] CSR_PMPADDR14 = 12'h3be; |
| localparam [11:0] CSR_PMPADDR15 = 12'h3bf; |
| localparam [11:0] CSR_TSELECT = 12'h7a0; |
| localparam [11:0] CSR_TDATA1 = 12'h7a1; |
| localparam [11:0] CSR_TDATA2 = 12'h7a2; |
| localparam [11:0] CSR_TDATA3 = 12'h7a3; |
| localparam [11:0] CSR_MCONTEXT = 12'h7a8; |
| localparam [11:0] CSR_SCONTEXT = 12'h7aa; |
| localparam [11:0] CSR_DCSR = 12'h7b0; |
| localparam [11:0] CSR_DPC = 12'h7b1; |
| localparam [11:0] CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] CSR_DSCRATCH1 = 12'h7b3; |
| localparam [11:0] CSR_MCOUNTINHIBIT = 12'h320; |
| localparam [11:0] CSR_MHPMEVENT3 = 12'h323; |
| localparam [11:0] CSR_MHPMEVENT4 = 12'h324; |
| localparam [11:0] CSR_MHPMEVENT5 = 12'h325; |
| localparam [11:0] CSR_MHPMEVENT6 = 12'h326; |
| localparam [11:0] CSR_MHPMEVENT7 = 12'h327; |
| localparam [11:0] CSR_MHPMEVENT8 = 12'h328; |
| localparam [11:0] CSR_MHPMEVENT9 = 12'h329; |
| localparam [11:0] CSR_MHPMEVENT10 = 12'h32a; |
| localparam [11:0] CSR_MHPMEVENT11 = 12'h32b; |
| localparam [11:0] CSR_MHPMEVENT12 = 12'h32c; |
| localparam [11:0] CSR_MHPMEVENT13 = 12'h32d; |
| localparam [11:0] CSR_MHPMEVENT14 = 12'h32e; |
| localparam [11:0] CSR_MHPMEVENT15 = 12'h32f; |
| localparam [11:0] CSR_MHPMEVENT16 = 12'h330; |
| localparam [11:0] CSR_MHPMEVENT17 = 12'h331; |
| localparam [11:0] CSR_MHPMEVENT18 = 12'h332; |
| localparam [11:0] CSR_MHPMEVENT19 = 12'h333; |
| localparam [11:0] CSR_MHPMEVENT20 = 12'h334; |
| localparam [11:0] CSR_MHPMEVENT21 = 12'h335; |
| localparam [11:0] CSR_MHPMEVENT22 = 12'h336; |
| localparam [11:0] CSR_MHPMEVENT23 = 12'h337; |
| localparam [11:0] CSR_MHPMEVENT24 = 12'h338; |
| localparam [11:0] CSR_MHPMEVENT25 = 12'h339; |
| localparam [11:0] CSR_MHPMEVENT26 = 12'h33a; |
| localparam [11:0] CSR_MHPMEVENT27 = 12'h33b; |
| localparam [11:0] CSR_MHPMEVENT28 = 12'h33c; |
| localparam [11:0] CSR_MHPMEVENT29 = 12'h33d; |
| localparam [11:0] CSR_MHPMEVENT30 = 12'h33e; |
| localparam [11:0] CSR_MHPMEVENT31 = 12'h33f; |
| localparam [11:0] CSR_MCYCLE = 12'hb00; |
| localparam [11:0] CSR_MINSTRET = 12'hb02; |
| localparam [11:0] CSR_MHPMCOUNTER3 = 12'hb03; |
| localparam [11:0] CSR_MHPMCOUNTER4 = 12'hb04; |
| localparam [11:0] CSR_MHPMCOUNTER5 = 12'hb05; |
| localparam [11:0] CSR_MHPMCOUNTER6 = 12'hb06; |
| localparam [11:0] CSR_MHPMCOUNTER7 = 12'hb07; |
| localparam [11:0] CSR_MHPMCOUNTER8 = 12'hb08; |
| localparam [11:0] CSR_MHPMCOUNTER9 = 12'hb09; |
| localparam [11:0] CSR_MHPMCOUNTER10 = 12'hb0a; |
| localparam [11:0] CSR_MHPMCOUNTER11 = 12'hb0b; |
| localparam [11:0] CSR_MHPMCOUNTER12 = 12'hb0c; |
| localparam [11:0] CSR_MHPMCOUNTER13 = 12'hb0d; |
| localparam [11:0] CSR_MHPMCOUNTER14 = 12'hb0e; |
| localparam [11:0] CSR_MHPMCOUNTER15 = 12'hb0f; |
| localparam [11:0] CSR_MHPMCOUNTER16 = 12'hb10; |
| localparam [11:0] CSR_MHPMCOUNTER17 = 12'hb11; |
| localparam [11:0] CSR_MHPMCOUNTER18 = 12'hb12; |
| localparam [11:0] CSR_MHPMCOUNTER19 = 12'hb13; |
| localparam [11:0] CSR_MHPMCOUNTER20 = 12'hb14; |
| localparam [11:0] CSR_MHPMCOUNTER21 = 12'hb15; |
| localparam [11:0] CSR_MHPMCOUNTER22 = 12'hb16; |
| localparam [11:0] CSR_MHPMCOUNTER23 = 12'hb17; |
| localparam [11:0] CSR_MHPMCOUNTER24 = 12'hb18; |
| localparam [11:0] CSR_MHPMCOUNTER25 = 12'hb19; |
| localparam [11:0] CSR_MHPMCOUNTER26 = 12'hb1a; |
| localparam [11:0] CSR_MHPMCOUNTER27 = 12'hb1b; |
| localparam [11:0] CSR_MHPMCOUNTER28 = 12'hb1c; |
| localparam [11:0] CSR_MHPMCOUNTER29 = 12'hb1d; |
| localparam [11:0] CSR_MHPMCOUNTER30 = 12'hb1e; |
| localparam [11:0] CSR_MHPMCOUNTER31 = 12'hb1f; |
| localparam [11:0] CSR_MCYCLEH = 12'hb80; |
| localparam [11:0] CSR_MINSTRETH = 12'hb82; |
| localparam [11:0] CSR_MHPMCOUNTER3H = 12'hb83; |
| localparam [11:0] CSR_MHPMCOUNTER4H = 12'hb84; |
| localparam [11:0] CSR_MHPMCOUNTER5H = 12'hb85; |
| localparam [11:0] CSR_MHPMCOUNTER6H = 12'hb86; |
| localparam [11:0] CSR_MHPMCOUNTER7H = 12'hb87; |
| localparam [11:0] CSR_MHPMCOUNTER8H = 12'hb88; |
| localparam [11:0] CSR_MHPMCOUNTER9H = 12'hb89; |
| localparam [11:0] CSR_MHPMCOUNTER10H = 12'hb8a; |
| localparam [11:0] CSR_MHPMCOUNTER11H = 12'hb8b; |
| localparam [11:0] CSR_MHPMCOUNTER12H = 12'hb8c; |
| localparam [11:0] CSR_MHPMCOUNTER13H = 12'hb8d; |
| localparam [11:0] CSR_MHPMCOUNTER14H = 12'hb8e; |
| localparam [11:0] CSR_MHPMCOUNTER15H = 12'hb8f; |
| localparam [11:0] CSR_MHPMCOUNTER16H = 12'hb90; |
| localparam [11:0] CSR_MHPMCOUNTER17H = 12'hb91; |
| localparam [11:0] CSR_MHPMCOUNTER18H = 12'hb92; |
| localparam [11:0] CSR_MHPMCOUNTER19H = 12'hb93; |
| localparam [11:0] CSR_MHPMCOUNTER20H = 12'hb94; |
| localparam [11:0] CSR_MHPMCOUNTER21H = 12'hb95; |
| localparam [11:0] CSR_MHPMCOUNTER22H = 12'hb96; |
| localparam [11:0] CSR_MHPMCOUNTER23H = 12'hb97; |
| localparam [11:0] CSR_MHPMCOUNTER24H = 12'hb98; |
| localparam [11:0] CSR_MHPMCOUNTER25H = 12'hb99; |
| localparam [11:0] CSR_MHPMCOUNTER26H = 12'hb9a; |
| localparam [11:0] CSR_MHPMCOUNTER27H = 12'hb9b; |
| localparam [11:0] CSR_MHPMCOUNTER28H = 12'hb9c; |
| localparam [11:0] CSR_MHPMCOUNTER29H = 12'hb9d; |
| localparam [11:0] CSR_MHPMCOUNTER30H = 12'hb9e; |
| localparam [11:0] CSR_MHPMCOUNTER31H = 12'hb9f; |
| localparam [11:0] CSR_CPUCTRL = 12'h7c0; |
| localparam [11:0] CSR_SECURESEED = 12'h7c1; |
| localparam [11:0] CSR_OFF_PMP_CFG = 12'h3a0; |
| localparam [11:0] CSR_OFF_PMP_ADDR = 12'h3b0; |
| localparam [31:0] CSR_MSTATUS_MIE_BIT = 3; |
| localparam [31:0] CSR_MSTATUS_MPIE_BIT = 7; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_LOW = 11; |
| localparam [31:0] CSR_MSTATUS_MPP_BIT_HIGH = 12; |
| localparam [31:0] CSR_MSTATUS_MPRV_BIT = 17; |
| localparam [31:0] CSR_MSTATUS_TW_BIT = 21; |
| localparam [1:0] CSR_MISA_MXL = 2'd1; |
| localparam [31:0] CSR_MSIX_BIT = 3; |
| localparam [31:0] CSR_MTIX_BIT = 7; |
| localparam [31:0] CSR_MEIX_BIT = 11; |
| localparam [31:0] CSR_MFIX_BIT_LOW = 16; |
| localparam [31:0] CSR_MFIX_BIT_HIGH = 30; |
| wire [31:0] rf_wdata_wb_mux [0:1]; |
| wire [1:0] rf_wdata_wb_mux_we; |
| generate |
| if (WritebackStage) begin : g_writeback_stage |
| reg [31:0] rf_wdata_wb_q; |
| reg rf_we_wb_q; |
| reg [4:0] rf_waddr_wb_q; |
| wire wb_done; |
| reg wb_valid_q; |
| reg [31:0] wb_pc_q; |
| reg [1:0] wb_instr_type_q; |
| wire wb_valid_d; |
| assign wb_valid_d = (en_wb_i & ready_wb_o) | (wb_valid_q & ~wb_done); |
| assign wb_done = (wb_instr_type_q == WB_INSTR_OTHER) | lsu_resp_valid_i; |
| always @(posedge clk_i or negedge rst_ni) |
| if (~rst_ni) |
| wb_valid_q <= 1'b0; |
| else |
| wb_valid_q <= wb_valid_d; |
| always @(posedge clk_i) |
| if (en_wb_i) begin |
| rf_we_wb_q <= rf_we_id_i; |
| rf_waddr_wb_q <= rf_waddr_id_i; |
| rf_wdata_wb_q <= rf_wdata_id_i; |
| wb_instr_type_q <= instr_type_wb_i; |
| wb_pc_q <= pc_id_i; |
| end |
| assign rf_waddr_wb_o = rf_waddr_wb_q; |
| assign rf_wdata_wb_mux[0] = rf_wdata_wb_q; |
| assign rf_wdata_wb_mux_we[0] = rf_we_wb_q & wb_valid_q; |
| assign ready_wb_o = ~wb_valid_q | wb_done; |
| assign rf_write_wb_o = wb_valid_q & (rf_we_wb_q | (wb_instr_type_q == WB_INSTR_LOAD)); |
| assign outstanding_load_wb_o = wb_valid_q & (wb_instr_type_q == WB_INSTR_LOAD); |
| assign outstanding_store_wb_o = wb_valid_q & (wb_instr_type_q == WB_INSTR_STORE); |
| assign pc_wb_o = wb_pc_q; |
| assign instr_done_wb_o = wb_valid_q & wb_done; |
| assign rf_wdata_fwd_wb_o = rf_wdata_wb_q; |
| end |
| else begin : g_bypass_wb |
| assign rf_waddr_wb_o = rf_waddr_id_i; |
| assign rf_wdata_wb_mux[0] = rf_wdata_id_i; |
| assign rf_wdata_wb_mux_we[0] = rf_we_id_i; |
| assign ready_wb_o = 1'b1; |
| wire unused_clk; |
| wire unused_rst; |
| wire unused_en_wb; |
| wire [1:0] unused_instr_type_wb; |
| wire [31:0] unused_pc_id; |
| wire unused_lsu_resp_valid; |
| assign unused_clk = clk_i; |
| assign unused_rst = rst_ni; |
| assign unused_en_wb = en_wb_i; |
| assign unused_instr_type_wb = instr_type_wb_i; |
| assign unused_pc_id = pc_id_i; |
| assign unused_lsu_resp_valid = lsu_resp_valid_i; |
| assign outstanding_load_wb_o = 1'b0; |
| assign outstanding_store_wb_o = 1'b0; |
| assign pc_wb_o = {32 {1'sb0}}; |
| assign rf_write_wb_o = 1'b0; |
| assign rf_wdata_fwd_wb_o = 32'b00000000000000000000000000000000; |
| assign instr_done_wb_o = 1'b0; |
| end |
| endgenerate |
| assign rf_wdata_wb_mux[1] = rf_wdata_lsu_i; |
| assign rf_wdata_wb_mux_we[1] = rf_we_lsu_i; |
| assign rf_wdata_wb_o = (rf_wdata_wb_mux_we[0] ? rf_wdata_wb_mux[0] : rf_wdata_wb_mux[1]); |
| assign rf_we_wb_o = |rf_wdata_wb_mux_we; |
| endmodule |
| module tlul_gpio ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| tl_o, |
| cio_gpio_i, |
| cio_gpio_o, |
| cio_gpio_en_o, |
| intr_gpio_o |
| ); |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_o; |
| input [31:0] cio_gpio_i; |
| output wire [31:0] cio_gpio_o; |
| output wire [31:0] cio_gpio_en_o; |
| output wire [31:0] intr_gpio_o; |
| localparam [5:0] GPIO_INTR_STATE_OFFSET = 6'h00; |
| localparam [5:0] GPIO_INTR_ENABLE_OFFSET = 6'h04; |
| localparam [5:0] GPIO_INTR_TEST_OFFSET = 6'h08; |
| localparam [5:0] GPIO_DATA_IN_OFFSET = 6'h0c; |
| localparam [5:0] GPIO_DIRECT_OUT_OFFSET = 6'h10; |
| localparam [5:0] GPIO_MASKED_OUT_LOWER_OFFSET = 6'h14; |
| localparam [5:0] GPIO_MASKED_OUT_UPPER_OFFSET = 6'h18; |
| localparam [5:0] GPIO_DIRECT_OE_OFFSET = 6'h1c; |
| localparam [5:0] GPIO_MASKED_OE_LOWER_OFFSET = 6'h20; |
| localparam [5:0] GPIO_MASKED_OE_UPPER_OFFSET = 6'h24; |
| localparam [5:0] GPIO_INTR_CTRL_EN_RISING_OFFSET = 6'h28; |
| localparam [5:0] GPIO_INTR_CTRL_EN_FALLING_OFFSET = 6'h2c; |
| localparam [5:0] GPIO_INTR_CTRL_EN_LVLHIGH_OFFSET = 6'h30; |
| localparam [5:0] GPIO_INTR_CTRL_EN_LVLLOW_OFFSET = 6'h34; |
| localparam [5:0] GPIO_CTRL_EN_INPUT_FILTER_OFFSET = 6'h38; |
| localparam signed [31:0] GPIO_INTR_STATE = 0; |
| localparam signed [31:0] GPIO_INTR_ENABLE = 1; |
| localparam signed [31:0] GPIO_INTR_TEST = 2; |
| localparam signed [31:0] GPIO_DATA_IN = 3; |
| localparam signed [31:0] GPIO_DIRECT_OUT = 4; |
| localparam signed [31:0] GPIO_MASKED_OUT_LOWER = 5; |
| localparam signed [31:0] GPIO_MASKED_OUT_UPPER = 6; |
| localparam signed [31:0] GPIO_DIRECT_OE = 7; |
| localparam signed [31:0] GPIO_MASKED_OE_LOWER = 8; |
| localparam signed [31:0] GPIO_MASKED_OE_UPPER = 9; |
| localparam signed [31:0] GPIO_INTR_CTRL_EN_RISING = 10; |
| localparam signed [31:0] GPIO_INTR_CTRL_EN_FALLING = 11; |
| localparam signed [31:0] GPIO_INTR_CTRL_EN_LVLHIGH = 12; |
| localparam signed [31:0] GPIO_INTR_CTRL_EN_LVLLOW = 13; |
| localparam signed [31:0] GPIO_CTRL_EN_INPUT_FILTER = 14; |
| localparam [59:0] GPIO_PERMIT = {4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111}; |
| wire [458:0] reg2hw; |
| wire [257:0] hw2reg; |
| reg [31:0] cio_gpio_q; |
| reg [31:0] cio_gpio_en_q; |
| wire [31:0] data_in_d; |
| generate |
| genvar i; |
| for (i = 0; i < 32; i = i + 1) begin : gen_filter |
| prim_filter_ctr #(.Cycles(16)) filter( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .enable_i(reg2hw[i]), |
| .filter_i(cio_gpio_i[i]), |
| .filter_o(data_in_d[i]) |
| ); |
| end |
| endgenerate |
| assign hw2reg[192] = 1'b1; |
| assign hw2reg[224-:32] = data_in_d; |
| assign cio_gpio_o = cio_gpio_q; |
| assign cio_gpio_en_o = cio_gpio_en_q; |
| assign hw2reg[191-:32] = cio_gpio_q; |
| assign hw2reg[127-:16] = cio_gpio_q[31:16]; |
| assign hw2reg[111-:16] = 16'h0000; |
| assign hw2reg[159-:16] = cio_gpio_q[15:0]; |
| assign hw2reg[143-:16] = 16'h0000; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| cio_gpio_q <= {32 {1'sb0}}; |
| else if (reg2hw[329]) |
| cio_gpio_q <= reg2hw[361-:32]; |
| else if (reg2hw[278]) |
| cio_gpio_q[31:16] <= (reg2hw[277-:16] & reg2hw[294-:16]) | (~reg2hw[277-:16] & cio_gpio_q[31:16]); |
| else if (reg2hw[312]) |
| cio_gpio_q[15:0] <= (reg2hw[311-:16] & reg2hw[328-:16]) | (~reg2hw[311-:16] & cio_gpio_q[15:0]); |
| assign hw2reg[95-:32] = cio_gpio_en_q; |
| assign hw2reg[31-:16] = cio_gpio_en_q[31:16]; |
| assign hw2reg[15-:16] = 16'h0000; |
| assign hw2reg[63-:16] = cio_gpio_en_q[15:0]; |
| assign hw2reg[47-:16] = 16'h0000; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| cio_gpio_en_q <= {32 {1'sb0}}; |
| else if (reg2hw[228]) |
| cio_gpio_en_q <= reg2hw[260-:32]; |
| else if (reg2hw[177]) |
| cio_gpio_en_q[31:16] <= (reg2hw[176-:16] & reg2hw[193-:16]) | (~reg2hw[176-:16] & cio_gpio_en_q[31:16]); |
| else if (reg2hw[211]) |
| cio_gpio_en_q[15:0] <= (reg2hw[210-:16] & reg2hw[227-:16]) | (~reg2hw[210-:16] & cio_gpio_en_q[15:0]); |
| reg [31:0] data_in_q; |
| always @(posedge clk_i) data_in_q <= data_in_d; |
| wire [31:0] event_intr_rise; |
| wire [31:0] event_intr_fall; |
| wire [31:0] event_intr_actlow; |
| wire [31:0] event_intr_acthigh; |
| wire [31:0] event_intr_combined; |
| prim_intr_hw #(.Width(32)) intr_hw( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .event_intr_i(event_intr_combined), |
| .reg2hw_intr_enable_q_i(reg2hw[426-:32]), |
| .reg2hw_intr_test_q_i(reg2hw[394-:32]), |
| .reg2hw_intr_test_qe_i(reg2hw[362]), |
| .reg2hw_intr_state_q_i(reg2hw[458-:32]), |
| .hw2reg_intr_state_de_o(hw2reg[225]), |
| .hw2reg_intr_state_d_o(hw2reg[257-:32]), |
| .intr_o(intr_gpio_o) |
| ); |
| assign event_intr_rise = (~data_in_q & data_in_d) & reg2hw[159-:32]; |
| assign event_intr_fall = (data_in_q & ~data_in_d) & reg2hw[127-:32]; |
| assign event_intr_acthigh = data_in_d & reg2hw[95-:32]; |
| assign event_intr_actlow = ~data_in_d & reg2hw[63-:32]; |
| assign event_intr_combined = ((event_intr_rise | event_intr_fall) | event_intr_actlow) | event_intr_acthigh; |
| gpio_reg_top u_reg( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(tl_i), |
| .tl_o(tl_o), |
| .reg2hw(reg2hw), |
| .hw2reg(hw2reg), |
| .devmode_i(1'b1) |
| ); |
| endmodule |
| module gpio_reg_top ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| tl_o, |
| reg2hw, |
| hw2reg, |
| devmode_i |
| ); |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_o; |
| output wire [458:0] reg2hw; |
| input wire [257:0] hw2reg; |
| input devmode_i; |
| localparam [5:0] GPIO_INTR_STATE_OFFSET = 6'h00; |
| localparam [5:0] GPIO_INTR_ENABLE_OFFSET = 6'h04; |
| localparam [5:0] GPIO_INTR_TEST_OFFSET = 6'h08; |
| localparam [5:0] GPIO_DATA_IN_OFFSET = 6'h0c; |
| localparam [5:0] GPIO_DIRECT_OUT_OFFSET = 6'h10; |
| localparam [5:0] GPIO_MASKED_OUT_LOWER_OFFSET = 6'h14; |
| localparam [5:0] GPIO_MASKED_OUT_UPPER_OFFSET = 6'h18; |
| localparam [5:0] GPIO_DIRECT_OE_OFFSET = 6'h1c; |
| localparam [5:0] GPIO_MASKED_OE_LOWER_OFFSET = 6'h20; |
| localparam [5:0] GPIO_MASKED_OE_UPPER_OFFSET = 6'h24; |
| localparam [5:0] GPIO_INTR_CTRL_EN_RISING_OFFSET = 6'h28; |
| localparam [5:0] GPIO_INTR_CTRL_EN_FALLING_OFFSET = 6'h2c; |
| localparam [5:0] GPIO_INTR_CTRL_EN_LVLHIGH_OFFSET = 6'h30; |
| localparam [5:0] GPIO_INTR_CTRL_EN_LVLLOW_OFFSET = 6'h34; |
| localparam [5:0] GPIO_CTRL_EN_INPUT_FILTER_OFFSET = 6'h38; |
| localparam signed [31:0] GPIO_INTR_STATE = 0; |
| localparam signed [31:0] GPIO_INTR_ENABLE = 1; |
| localparam signed [31:0] GPIO_INTR_TEST = 2; |
| localparam signed [31:0] GPIO_DATA_IN = 3; |
| localparam signed [31:0] GPIO_DIRECT_OUT = 4; |
| localparam signed [31:0] GPIO_MASKED_OUT_LOWER = 5; |
| localparam signed [31:0] GPIO_MASKED_OUT_UPPER = 6; |
| localparam signed [31:0] GPIO_DIRECT_OE = 7; |
| localparam signed [31:0] GPIO_MASKED_OE_LOWER = 8; |
| localparam signed [31:0] GPIO_MASKED_OE_UPPER = 9; |
| localparam signed [31:0] GPIO_INTR_CTRL_EN_RISING = 10; |
| localparam signed [31:0] GPIO_INTR_CTRL_EN_FALLING = 11; |
| localparam signed [31:0] GPIO_INTR_CTRL_EN_LVLHIGH = 12; |
| localparam signed [31:0] GPIO_INTR_CTRL_EN_LVLLOW = 13; |
| localparam signed [31:0] GPIO_CTRL_EN_INPUT_FILTER = 14; |
| localparam [59:0] GPIO_PERMIT = {4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b1111}; |
| localparam signed [31:0] AW = 6; |
| localparam signed [31:0] DW = 32; |
| localparam signed [31:0] DBW = DW / 8; |
| wire reg_we; |
| wire reg_re; |
| wire [AW - 1:0] reg_addr; |
| wire [DW - 1:0] reg_wdata; |
| wire [DBW - 1:0] reg_be; |
| wire [DW - 1:0] reg_rdata; |
| wire reg_error; |
| wire addrmiss; |
| reg wr_err; |
| reg [DW - 1:0] reg_rdata_next; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_reg_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_reg_d2h; |
| assign tl_reg_h2d = tl_i; |
| assign tl_o = tl_reg_d2h; |
| tlul_adapter_reg #( |
| .RegAw(AW), |
| .RegDw(DW) |
| ) u_reg_if( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(tl_reg_h2d), |
| .tl_o(tl_reg_d2h), |
| .we_o(reg_we), |
| .re_o(reg_re), |
| .addr_o(reg_addr), |
| .wdata_o(reg_wdata), |
| .be_o(reg_be), |
| .rdata_i(reg_rdata), |
| .error_i(reg_error) |
| ); |
| assign reg_rdata = reg_rdata_next; |
| assign reg_error = (devmode_i & addrmiss) | wr_err; |
| wire [31:0] intr_state_qs; |
| wire [31:0] intr_state_wd; |
| wire intr_state_we; |
| wire [31:0] intr_enable_qs; |
| wire [31:0] intr_enable_wd; |
| wire intr_enable_we; |
| wire [31:0] intr_test_wd; |
| wire intr_test_we; |
| wire [31:0] data_in_qs; |
| wire [31:0] direct_out_qs; |
| wire [31:0] direct_out_wd; |
| wire direct_out_we; |
| wire direct_out_re; |
| wire [15:0] masked_out_lower_data_qs; |
| wire [15:0] masked_out_lower_data_wd; |
| wire masked_out_lower_data_we; |
| wire masked_out_lower_data_re; |
| wire [15:0] masked_out_lower_mask_wd; |
| wire masked_out_lower_mask_we; |
| wire [15:0] masked_out_upper_data_qs; |
| wire [15:0] masked_out_upper_data_wd; |
| wire masked_out_upper_data_we; |
| wire masked_out_upper_data_re; |
| wire [15:0] masked_out_upper_mask_wd; |
| wire masked_out_upper_mask_we; |
| wire [31:0] direct_oe_qs; |
| wire [31:0] direct_oe_wd; |
| wire direct_oe_we; |
| wire direct_oe_re; |
| wire [15:0] masked_oe_lower_data_qs; |
| wire [15:0] masked_oe_lower_data_wd; |
| wire masked_oe_lower_data_we; |
| wire masked_oe_lower_data_re; |
| wire [15:0] masked_oe_lower_mask_qs; |
| wire [15:0] masked_oe_lower_mask_wd; |
| wire masked_oe_lower_mask_we; |
| wire masked_oe_lower_mask_re; |
| wire [15:0] masked_oe_upper_data_qs; |
| wire [15:0] masked_oe_upper_data_wd; |
| wire masked_oe_upper_data_we; |
| wire masked_oe_upper_data_re; |
| wire [15:0] masked_oe_upper_mask_qs; |
| wire [15:0] masked_oe_upper_mask_wd; |
| wire masked_oe_upper_mask_we; |
| wire masked_oe_upper_mask_re; |
| wire [31:0] intr_ctrl_en_rising_qs; |
| wire [31:0] intr_ctrl_en_rising_wd; |
| wire intr_ctrl_en_rising_we; |
| wire [31:0] intr_ctrl_en_falling_qs; |
| wire [31:0] intr_ctrl_en_falling_wd; |
| wire intr_ctrl_en_falling_we; |
| wire [31:0] intr_ctrl_en_lvlhigh_qs; |
| wire [31:0] intr_ctrl_en_lvlhigh_wd; |
| wire intr_ctrl_en_lvlhigh_we; |
| wire [31:0] intr_ctrl_en_lvllow_qs; |
| wire [31:0] intr_ctrl_en_lvllow_wd; |
| wire intr_ctrl_en_lvllow_we; |
| wire [31:0] ctrl_en_input_filter_qs; |
| wire [31:0] ctrl_en_input_filter_wd; |
| wire ctrl_en_input_filter_we; |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(24), |
| .SWACCESS("W1C"), |
| .RESVAL(32'h00000000) |
| ) u_intr_state( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_state_we), |
| .wd(intr_state_wd), |
| .de(hw2reg[225]), |
| .d(hw2reg[257-:32]), |
| .qe(), |
| .q(reg2hw[458-:32]), |
| .qs(intr_state_qs) |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(32'h00000000) |
| ) u_intr_enable( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_enable_we), |
| .wd(intr_enable_wd), |
| .de(1'b0), |
| .d({32 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[426-:32]), |
| .qs(intr_enable_qs) |
| ); |
| prim_subreg_ext #(.DW(32)) u_intr_test( |
| .re(1'b0), |
| .we(intr_test_we), |
| .wd(intr_test_wd), |
| .d({32 {1'sb0}}), |
| .qre(), |
| .qe(reg2hw[362]), |
| .q(reg2hw[394-:32]), |
| .qs() |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(32'h00000000) |
| ) u_data_in( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd({32 {1'sb0}}), |
| .de(hw2reg[192]), |
| .d(hw2reg[224-:32]), |
| .qe(), |
| .q(), |
| .qs(data_in_qs) |
| ); |
| prim_subreg_ext #(.DW(32)) u_direct_out( |
| .re(direct_out_re), |
| .we(direct_out_we), |
| .wd(direct_out_wd), |
| .d(hw2reg[191-:32]), |
| .qre(), |
| .qe(reg2hw[329]), |
| .q(reg2hw[361-:32]), |
| .qs(direct_out_qs) |
| ); |
| prim_subreg_ext #(.DW(16)) u_masked_out_lower_data( |
| .re(masked_out_lower_data_re), |
| .we(masked_out_lower_data_we), |
| .wd(masked_out_lower_data_wd), |
| .d(hw2reg[159-:16]), |
| .qre(), |
| .qe(reg2hw[312]), |
| .q(reg2hw[328-:16]), |
| .qs(masked_out_lower_data_qs) |
| ); |
| prim_subreg_ext #(.DW(16)) u_masked_out_lower_mask( |
| .re(1'b0), |
| .we(masked_out_lower_mask_we), |
| .wd(masked_out_lower_mask_wd), |
| .d(hw2reg[143-:16]), |
| .qre(), |
| .qe(reg2hw[295]), |
| .q(reg2hw[311-:16]), |
| .qs() |
| ); |
| prim_subreg_ext #(.DW(16)) u_masked_out_upper_data( |
| .re(masked_out_upper_data_re), |
| .we(masked_out_upper_data_we), |
| .wd(masked_out_upper_data_wd), |
| .d(hw2reg[127-:16]), |
| .qre(), |
| .qe(reg2hw[278]), |
| .q(reg2hw[294-:16]), |
| .qs(masked_out_upper_data_qs) |
| ); |
| prim_subreg_ext #(.DW(16)) u_masked_out_upper_mask( |
| .re(1'b0), |
| .we(masked_out_upper_mask_we), |
| .wd(masked_out_upper_mask_wd), |
| .d(hw2reg[111-:16]), |
| .qre(), |
| .qe(reg2hw[261]), |
| .q(reg2hw[277-:16]), |
| .qs() |
| ); |
| prim_subreg_ext #(.DW(32)) u_direct_oe( |
| .re(direct_oe_re), |
| .we(direct_oe_we), |
| .wd(direct_oe_wd), |
| .d(hw2reg[95-:32]), |
| .qre(), |
| .qe(reg2hw[228]), |
| .q(reg2hw[260-:32]), |
| .qs(direct_oe_qs) |
| ); |
| prim_subreg_ext #(.DW(16)) u_masked_oe_lower_data( |
| .re(masked_oe_lower_data_re), |
| .we(masked_oe_lower_data_we), |
| .wd(masked_oe_lower_data_wd), |
| .d(hw2reg[63-:16]), |
| .qre(), |
| .qe(reg2hw[211]), |
| .q(reg2hw[227-:16]), |
| .qs(masked_oe_lower_data_qs) |
| ); |
| prim_subreg_ext #(.DW(16)) u_masked_oe_lower_mask( |
| .re(masked_oe_lower_mask_re), |
| .we(masked_oe_lower_mask_we), |
| .wd(masked_oe_lower_mask_wd), |
| .d(hw2reg[47-:16]), |
| .qre(), |
| .qe(reg2hw[194]), |
| .q(reg2hw[210-:16]), |
| .qs(masked_oe_lower_mask_qs) |
| ); |
| prim_subreg_ext #(.DW(16)) u_masked_oe_upper_data( |
| .re(masked_oe_upper_data_re), |
| .we(masked_oe_upper_data_we), |
| .wd(masked_oe_upper_data_wd), |
| .d(hw2reg[31-:16]), |
| .qre(), |
| .qe(reg2hw[177]), |
| .q(reg2hw[193-:16]), |
| .qs(masked_oe_upper_data_qs) |
| ); |
| prim_subreg_ext #(.DW(16)) u_masked_oe_upper_mask( |
| .re(masked_oe_upper_mask_re), |
| .we(masked_oe_upper_mask_we), |
| .wd(masked_oe_upper_mask_wd), |
| .d(hw2reg[15-:16]), |
| .qre(), |
| .qe(reg2hw[160]), |
| .q(reg2hw[176-:16]), |
| .qs(masked_oe_upper_mask_qs) |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(32'h00000000) |
| ) u_intr_ctrl_en_rising( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_ctrl_en_rising_we), |
| .wd(intr_ctrl_en_rising_wd), |
| .de(1'b0), |
| .d({32 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[159-:32]), |
| .qs(intr_ctrl_en_rising_qs) |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(32'h00000000) |
| ) u_intr_ctrl_en_falling( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_ctrl_en_falling_we), |
| .wd(intr_ctrl_en_falling_wd), |
| .de(1'b0), |
| .d({32 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[127-:32]), |
| .qs(intr_ctrl_en_falling_qs) |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(32'h00000000) |
| ) u_intr_ctrl_en_lvlhigh( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_ctrl_en_lvlhigh_we), |
| .wd(intr_ctrl_en_lvlhigh_wd), |
| .de(1'b0), |
| .d({32 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[95-:32]), |
| .qs(intr_ctrl_en_lvlhigh_qs) |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(32'h00000000) |
| ) u_intr_ctrl_en_lvllow( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_ctrl_en_lvllow_we), |
| .wd(intr_ctrl_en_lvllow_wd), |
| .de(1'b0), |
| .d({32 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[63-:32]), |
| .qs(intr_ctrl_en_lvllow_qs) |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(32'h00000000) |
| ) u_ctrl_en_input_filter( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_en_input_filter_we), |
| .wd(ctrl_en_input_filter_wd), |
| .de(1'b0), |
| .d({32 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[31-:32]), |
| .qs(ctrl_en_input_filter_qs) |
| ); |
| reg [14:0] addr_hit; |
| always @(*) begin |
| addr_hit = {15 {1'sb0}}; |
| addr_hit[0] = reg_addr == GPIO_INTR_STATE_OFFSET; |
| addr_hit[1] = reg_addr == GPIO_INTR_ENABLE_OFFSET; |
| addr_hit[2] = reg_addr == GPIO_INTR_TEST_OFFSET; |
| addr_hit[3] = reg_addr == GPIO_DATA_IN_OFFSET; |
| addr_hit[4] = reg_addr == GPIO_DIRECT_OUT_OFFSET; |
| addr_hit[5] = reg_addr == GPIO_MASKED_OUT_LOWER_OFFSET; |
| addr_hit[6] = reg_addr == GPIO_MASKED_OUT_UPPER_OFFSET; |
| addr_hit[7] = reg_addr == GPIO_DIRECT_OE_OFFSET; |
| addr_hit[8] = reg_addr == GPIO_MASKED_OE_LOWER_OFFSET; |
| addr_hit[9] = reg_addr == GPIO_MASKED_OE_UPPER_OFFSET; |
| addr_hit[10] = reg_addr == GPIO_INTR_CTRL_EN_RISING_OFFSET; |
| addr_hit[11] = reg_addr == GPIO_INTR_CTRL_EN_FALLING_OFFSET; |
| addr_hit[12] = reg_addr == GPIO_INTR_CTRL_EN_LVLHIGH_OFFSET; |
| addr_hit[13] = reg_addr == GPIO_INTR_CTRL_EN_LVLLOW_OFFSET; |
| addr_hit[14] = reg_addr == GPIO_CTRL_EN_INPUT_FILTER_OFFSET; |
| end |
| assign addrmiss = (reg_re || reg_we ? ~|addr_hit : 1'b0); |
| always @(*) begin |
| wr_err = 1'b0; |
| if ((addr_hit[0] && reg_we) && (GPIO_PERMIT[56+:4] != (GPIO_PERMIT[56+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[1] && reg_we) && (GPIO_PERMIT[52+:4] != (GPIO_PERMIT[52+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[2] && reg_we) && (GPIO_PERMIT[48+:4] != (GPIO_PERMIT[48+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[3] && reg_we) && (GPIO_PERMIT[44+:4] != (GPIO_PERMIT[44+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[4] && reg_we) && (GPIO_PERMIT[40+:4] != (GPIO_PERMIT[40+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[5] && reg_we) && (GPIO_PERMIT[36+:4] != (GPIO_PERMIT[36+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[6] && reg_we) && (GPIO_PERMIT[32+:4] != (GPIO_PERMIT[32+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[7] && reg_we) && (GPIO_PERMIT[28+:4] != (GPIO_PERMIT[28+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[8] && reg_we) && (GPIO_PERMIT[24+:4] != (GPIO_PERMIT[24+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[9] && reg_we) && (GPIO_PERMIT[20+:4] != (GPIO_PERMIT[20+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[10] && reg_we) && (GPIO_PERMIT[16+:4] != (GPIO_PERMIT[16+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[11] && reg_we) && (GPIO_PERMIT[12+:4] != (GPIO_PERMIT[12+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[12] && reg_we) && (GPIO_PERMIT[8+:4] != (GPIO_PERMIT[8+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[13] && reg_we) && (GPIO_PERMIT[4+:4] != (GPIO_PERMIT[4+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[14] && reg_we) && (GPIO_PERMIT[0+:4] != (GPIO_PERMIT[0+:4] & reg_be))) |
| wr_err = 1'b1; |
| end |
| assign intr_state_we = (addr_hit[0] & reg_we) & ~wr_err; |
| assign intr_state_wd = reg_wdata[31:0]; |
| assign intr_enable_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign intr_enable_wd = reg_wdata[31:0]; |
| assign intr_test_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign intr_test_wd = reg_wdata[31:0]; |
| assign direct_out_we = (addr_hit[4] & reg_we) & ~wr_err; |
| assign direct_out_wd = reg_wdata[31:0]; |
| assign direct_out_re = addr_hit[4] && reg_re; |
| assign masked_out_lower_data_we = (addr_hit[5] & reg_we) & ~wr_err; |
| assign masked_out_lower_data_wd = reg_wdata[15:0]; |
| assign masked_out_lower_data_re = addr_hit[5] && reg_re; |
| assign masked_out_lower_mask_we = (addr_hit[5] & reg_we) & ~wr_err; |
| assign masked_out_lower_mask_wd = reg_wdata[31:16]; |
| assign masked_out_upper_data_we = (addr_hit[6] & reg_we) & ~wr_err; |
| assign masked_out_upper_data_wd = reg_wdata[15:0]; |
| assign masked_out_upper_data_re = addr_hit[6] && reg_re; |
| assign masked_out_upper_mask_we = (addr_hit[6] & reg_we) & ~wr_err; |
| assign masked_out_upper_mask_wd = reg_wdata[31:16]; |
| assign direct_oe_we = (addr_hit[7] & reg_we) & ~wr_err; |
| assign direct_oe_wd = reg_wdata[31:0]; |
| assign direct_oe_re = addr_hit[7] && reg_re; |
| assign masked_oe_lower_data_we = (addr_hit[8] & reg_we) & ~wr_err; |
| assign masked_oe_lower_data_wd = reg_wdata[15:0]; |
| assign masked_oe_lower_data_re = addr_hit[8] && reg_re; |
| assign masked_oe_lower_mask_we = (addr_hit[8] & reg_we) & ~wr_err; |
| assign masked_oe_lower_mask_wd = reg_wdata[31:16]; |
| assign masked_oe_lower_mask_re = addr_hit[8] && reg_re; |
| assign masked_oe_upper_data_we = (addr_hit[9] & reg_we) & ~wr_err; |
| assign masked_oe_upper_data_wd = reg_wdata[15:0]; |
| assign masked_oe_upper_data_re = addr_hit[9] && reg_re; |
| assign masked_oe_upper_mask_we = (addr_hit[9] & reg_we) & ~wr_err; |
| assign masked_oe_upper_mask_wd = reg_wdata[31:16]; |
| assign masked_oe_upper_mask_re = addr_hit[9] && reg_re; |
| assign intr_ctrl_en_rising_we = (addr_hit[10] & reg_we) & ~wr_err; |
| assign intr_ctrl_en_rising_wd = reg_wdata[31:0]; |
| assign intr_ctrl_en_falling_we = (addr_hit[11] & reg_we) & ~wr_err; |
| assign intr_ctrl_en_falling_wd = reg_wdata[31:0]; |
| assign intr_ctrl_en_lvlhigh_we = (addr_hit[12] & reg_we) & ~wr_err; |
| assign intr_ctrl_en_lvlhigh_wd = reg_wdata[31:0]; |
| assign intr_ctrl_en_lvllow_we = (addr_hit[13] & reg_we) & ~wr_err; |
| assign intr_ctrl_en_lvllow_wd = reg_wdata[31:0]; |
| assign ctrl_en_input_filter_we = (addr_hit[14] & reg_we) & ~wr_err; |
| assign ctrl_en_input_filter_wd = reg_wdata[31:0]; |
| always @(*) begin |
| reg_rdata_next = {DW {1'sb0}}; |
| case (1'b1) |
| addr_hit[0]: reg_rdata_next[31:0] = intr_state_qs; |
| addr_hit[1]: reg_rdata_next[31:0] = intr_enable_qs; |
| addr_hit[2]: reg_rdata_next[31:0] = {32 {1'sb0}}; |
| addr_hit[3]: reg_rdata_next[31:0] = data_in_qs; |
| addr_hit[4]: reg_rdata_next[31:0] = direct_out_qs; |
| addr_hit[5]: begin |
| reg_rdata_next[15:0] = masked_out_lower_data_qs; |
| reg_rdata_next[31:16] = {16 {1'sb0}}; |
| end |
| addr_hit[6]: begin |
| reg_rdata_next[15:0] = masked_out_upper_data_qs; |
| reg_rdata_next[31:16] = {16 {1'sb0}}; |
| end |
| addr_hit[7]: reg_rdata_next[31:0] = direct_oe_qs; |
| addr_hit[8]: begin |
| reg_rdata_next[15:0] = masked_oe_lower_data_qs; |
| reg_rdata_next[31:16] = masked_oe_lower_mask_qs; |
| end |
| addr_hit[9]: begin |
| reg_rdata_next[15:0] = masked_oe_upper_data_qs; |
| reg_rdata_next[31:16] = masked_oe_upper_mask_qs; |
| end |
| addr_hit[10]: reg_rdata_next[31:0] = intr_ctrl_en_rising_qs; |
| addr_hit[11]: reg_rdata_next[31:0] = intr_ctrl_en_falling_qs; |
| addr_hit[12]: reg_rdata_next[31:0] = intr_ctrl_en_lvlhigh_qs; |
| addr_hit[13]: reg_rdata_next[31:0] = intr_ctrl_en_lvllow_qs; |
| addr_hit[14]: reg_rdata_next[31:0] = ctrl_en_input_filter_qs; |
| default: reg_rdata_next = {DW {1'sb1}}; |
| endcase |
| end |
| endmodule |
| module prim_arbiter_ppc ( |
| clk_i, |
| rst_ni, |
| req_i, |
| data_i, |
| gnt_o, |
| idx_o, |
| valid_o, |
| data_o, |
| ready_i |
| ); |
| parameter [31:0] N = 8; |
| parameter [31:0] DW = 32; |
| parameter [0:0] EnDataPort = 1; |
| parameter [0:0] EnReqStabA = 1; |
| localparam signed [31:0] IdxW = $clog2(N); |
| input clk_i; |
| input rst_ni; |
| input [N - 1:0] req_i; |
| input [(0 >= (N - 1) ? ((2 - N) * DW) + (((N - 1) * DW) - 1) : (N * DW) - 1):(0 >= (N - 1) ? (N - 1) * DW : 0)] data_i; |
| output wire [N - 1:0] gnt_o; |
| output reg [IdxW - 1:0] idx_o; |
| output wire valid_o; |
| output reg [DW - 1:0] data_o; |
| input ready_i; |
| generate |
| if (N == 1) begin : gen_degenerate_case |
| assign valid_o = req_i[0]; |
| always @(*) data_o = data_i[(0 >= (N - 1) ? 0 : N - 1) * DW+:DW]; |
| assign gnt_o[0] = valid_o & ready_i; |
| always @(*) idx_o = {IdxW {1'sb0}}; |
| end |
| else begin : gen_normal_case |
| wire [N - 1:0] masked_req; |
| reg [N - 1:0] ppc_out; |
| wire [N - 1:0] arb_req; |
| reg [N - 1:0] mask; |
| wire [N - 1:0] mask_next; |
| wire [N - 1:0] winner; |
| assign masked_req = mask & req_i; |
| assign arb_req = (|masked_req ? masked_req : req_i); |
| always @(*) begin |
| ppc_out[0] = arb_req[0]; |
| begin : sv2v_autoblock_71 |
| reg signed [31:0] i; |
| for (i = 1; i < N; i = i + 1) |
| ppc_out[i] = ppc_out[i - 1] | arb_req[i]; |
| end |
| end |
| assign winner = ppc_out ^ {ppc_out[N - 2:0], 1'b0}; |
| assign gnt_o = (ready_i ? winner : {N {1'sb0}}); |
| assign valid_o = |req_i; |
| assign mask_next = {ppc_out[N - 2:0], 1'b0}; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| mask <= {N {1'sb0}}; |
| else if (valid_o && ready_i) |
| mask <= mask_next; |
| else if (valid_o && !ready_i) |
| mask <= ppc_out; |
| if (EnDataPort == 1) begin : gen_datapath |
| always @(*) begin |
| data_o = {DW {1'sb0}}; |
| begin : sv2v_autoblock_72 |
| reg signed [31:0] i; |
| for (i = 0; i < N; i = i + 1) |
| if (winner[i]) |
| data_o = data_i[(0 >= (N - 1) ? i : (N - 1) - i) * DW+:DW]; |
| end |
| end |
| end |
| else begin : gen_nodatapath |
| always @(*) data_o = {DW {1'sb1}}; |
| end |
| always @(*) begin |
| idx_o = {IdxW {1'sb0}}; |
| begin : sv2v_autoblock_73 |
| reg signed [31:0] i; |
| for (i = 0; i < N; i = i + 1) |
| if (winner[i]) |
| idx_o = i[IdxW - 1:0]; |
| end |
| end |
| end |
| endgenerate |
| endmodule |
| module prim_clock_gating ( |
| clk_i, |
| en_i, |
| test_en_i, |
| clk_o |
| ); |
| input clk_i; |
| input en_i; |
| input test_en_i; |
| output wire clk_o; |
| localparam integer prim_pkg_ImplGeneric = 0; |
| parameter integer Impl = prim_pkg_ImplGeneric; |
| generate |
| if (Impl == prim_pkg_ImplGeneric) begin : gen_generic |
| prim_generic_clock_gating u_impl_generic( |
| .clk_i(clk_i), |
| .en_i(en_i), |
| .test_en_i(test_en_i), |
| .clk_o(clk_o) |
| ); |
| end |
| endgenerate |
| endmodule |
| module prim_diff_decode ( |
| clk_i, |
| rst_ni, |
| diff_pi, |
| diff_ni, |
| level_o, |
| rise_o, |
| fall_o, |
| event_o, |
| sigint_o |
| ); |
| parameter [0:0] AsyncOn = 1'b0; |
| input clk_i; |
| input rst_ni; |
| input diff_pi; |
| input diff_ni; |
| output wire level_o; |
| output reg rise_o; |
| output reg fall_o; |
| output wire event_o; |
| output reg sigint_o; |
| reg level_d; |
| reg level_q; |
| localparam [1:0] IsSkewed = 1; |
| localparam [1:0] IsStd = 0; |
| localparam [1:0] SigInt = 2; |
| generate |
| if (AsyncOn) begin : gen_async |
| reg [1:0] state_d; |
| reg [1:0] state_q; |
| wire diff_p_edge; |
| wire diff_n_edge; |
| wire diff_check_ok; |
| wire level; |
| reg diff_pq; |
| reg diff_nq; |
| wire diff_pd; |
| wire diff_nd; |
| prim_generic_flop_2sync #( |
| .Width(1), |
| .ResetValue(1'sb0) |
| ) i_sync_p( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .d_i(diff_pi), |
| .q_o(diff_pd) |
| ); |
| prim_generic_flop_2sync #( |
| .Width(1), |
| .ResetValue(1'b1) |
| ) i_sync_n( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .d_i(diff_ni), |
| .q_o(diff_nd) |
| ); |
| assign diff_p_edge = diff_pq ^ diff_pd; |
| assign diff_n_edge = diff_nq ^ diff_nd; |
| assign diff_check_ok = diff_pd ^ diff_nd; |
| assign level = diff_pd; |
| assign level_o = level_d; |
| assign event_o = rise_o | fall_o; |
| always @(*) begin : p_diff_fsm |
| state_d = state_q; |
| level_d = level_q; |
| rise_o = 1'b0; |
| fall_o = 1'b0; |
| sigint_o = 1'b0; |
| case (state_q) |
| IsStd: |
| if (diff_check_ok) begin |
| level_d = level; |
| if (diff_p_edge && diff_n_edge) |
| if (level) |
| rise_o = 1'b1; |
| else |
| fall_o = 1'b1; |
| end |
| else if (diff_p_edge || diff_n_edge) |
| state_d = IsSkewed; |
| else begin |
| state_d = SigInt; |
| sigint_o = 1'b1; |
| end |
| IsSkewed: |
| if (diff_check_ok) begin |
| state_d = IsStd; |
| level_d = level; |
| if (level) |
| rise_o = 1'b1; |
| else |
| fall_o = 1'b1; |
| end |
| else begin |
| state_d = SigInt; |
| sigint_o = 1'b1; |
| end |
| SigInt: begin |
| sigint_o = 1'b1; |
| if (diff_check_ok) begin |
| state_d = IsStd; |
| sigint_o = 1'b0; |
| end |
| end |
| default: |
| ; |
| endcase |
| end |
| always @(posedge clk_i or negedge rst_ni) begin : p_sync_reg |
| if (!rst_ni) begin |
| state_q <= IsStd; |
| diff_pq <= 1'b0; |
| diff_nq <= 1'b1; |
| level_q <= 1'b0; |
| end |
| else begin |
| state_q <= state_d; |
| diff_pq <= diff_pd; |
| diff_nq <= diff_nd; |
| level_q <= level_d; |
| end |
| end |
| end |
| else begin : gen_no_async |
| reg diff_pq; |
| wire diff_pd; |
| assign diff_pd = diff_pi; |
| always @(*) sigint_o = ~(diff_pi ^ diff_ni); |
| assign level_o = (sigint_o ? level_q : diff_pi); |
| always @(*) level_d = level_o; |
| always @(*) rise_o = (~diff_pq & diff_pi) & ~sigint_o; |
| always @(*) fall_o = (diff_pq & ~diff_pi) & ~sigint_o; |
| assign event_o = rise_o | fall_o; |
| always @(posedge clk_i or negedge rst_ni) begin : p_edge_reg |
| if (!rst_ni) begin |
| diff_pq <= 1'b0; |
| level_q <= 1'b0; |
| end |
| else begin |
| diff_pq <= diff_pd; |
| level_q <= level_d; |
| end |
| end |
| end |
| endgenerate |
| endmodule |
| module prim_esc_receiver ( |
| clk_i, |
| rst_ni, |
| esc_en_o, |
| esc_rx_o, |
| esc_tx_i |
| ); |
| input clk_i; |
| input rst_ni; |
| output reg esc_en_o; |
| output wire [1:0] esc_rx_o; |
| input wire [1:0] esc_tx_i; |
| wire esc_level; |
| wire sigint_detected; |
| prim_diff_decode #(.AsyncOn(1'b0)) i_decode_esc( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .diff_pi(esc_tx_i[1]), |
| .diff_ni(esc_tx_i[0]), |
| .level_o(esc_level), |
| .rise_o(), |
| .fall_o(), |
| .event_o(), |
| .sigint_o(sigint_detected) |
| ); |
| reg [2:0] state_d; |
| reg [2:0] state_q; |
| reg resp_pd; |
| reg resp_pq; |
| reg resp_nd; |
| reg resp_nq; |
| assign esc_rx_o[1] = resp_pq; |
| assign esc_rx_o[0] = resp_nq; |
| localparam [2:0] Check = 1; |
| localparam [2:0] EscResp = 3; |
| localparam [2:0] Idle = 0; |
| localparam [2:0] PingResp = 2; |
| localparam [2:0] SigInt = 4; |
| always @(*) begin : p_fsm |
| state_d = state_q; |
| resp_pd = 1'b0; |
| resp_nd = 1'b1; |
| esc_en_o = 1'b0; |
| case (state_q) |
| Idle: |
| if (esc_level) begin |
| state_d = Check; |
| resp_pd = 1'b1; |
| resp_nd = 1'b0; |
| end |
| Check: begin |
| state_d = PingResp; |
| if (esc_level) begin |
| state_d = EscResp; |
| esc_en_o = 1'b1; |
| end |
| end |
| PingResp: begin |
| state_d = Idle; |
| resp_pd = 1'b1; |
| resp_nd = 1'b0; |
| if (esc_level) begin |
| state_d = EscResp; |
| esc_en_o = 1'b1; |
| end |
| end |
| EscResp: begin |
| state_d = Idle; |
| if (esc_level) begin |
| state_d = EscResp; |
| resp_pd = ~resp_pq; |
| resp_nd = resp_pq; |
| esc_en_o = 1'b1; |
| end |
| end |
| SigInt: begin |
| state_d = Idle; |
| if (sigint_detected) begin |
| state_d = SigInt; |
| resp_pd = ~resp_pq; |
| resp_nd = ~resp_pq; |
| end |
| end |
| default: state_d = Idle; |
| endcase |
| if (sigint_detected && (state_q != SigInt)) begin |
| state_d = SigInt; |
| resp_pd = 1'b0; |
| resp_nd = 1'b0; |
| end |
| end |
| always @(posedge clk_i or negedge rst_ni) begin : p_regs |
| if (!rst_ni) begin |
| state_q <= Idle; |
| resp_pq <= 1'b0; |
| resp_nq <= 1'b1; |
| end |
| else begin |
| state_q <= state_d; |
| resp_pq <= resp_pd; |
| resp_nq <= resp_nd; |
| end |
| end |
| endmodule |
| module prim_fifo_async ( |
| clk_wr_i, |
| rst_wr_ni, |
| wvalid_i, |
| wready_o, |
| wdata_i, |
| wdepth_o, |
| clk_rd_i, |
| rst_rd_ni, |
| rvalid_o, |
| rready_i, |
| rdata_o, |
| rdepth_o |
| ); |
| parameter [31:0] Width = 16; |
| parameter [31:0] Depth = 3; |
| localparam [31:0] DepthW = $clog2(Depth + 1); |
| input clk_wr_i; |
| input rst_wr_ni; |
| input wvalid_i; |
| output wready_o; |
| input [Width - 1:0] wdata_i; |
| output [DepthW - 1:0] wdepth_o; |
| input clk_rd_i; |
| input rst_rd_ni; |
| output rvalid_o; |
| input rready_i; |
| output [Width - 1:0] rdata_o; |
| output [DepthW - 1:0] rdepth_o; |
| localparam [31:0] PTRV_W = $clog2(Depth); |
| function automatic [PTRV_W - 1:0] sv2v_cast_2173F_unsigned; |
| input reg [PTRV_W - 1:0] inp; |
| sv2v_cast_2173F_unsigned = inp; |
| endfunction |
| localparam [PTRV_W - 1:0] DepthMinus1 = sv2v_cast_2173F_unsigned(Depth - 1); |
| localparam [31:0] PTR_WIDTH = PTRV_W + 1; |
| reg [PTR_WIDTH - 1:0] fifo_wptr; |
| reg [PTR_WIDTH - 1:0] fifo_rptr; |
| wire [PTR_WIDTH - 1:0] fifo_wptr_sync_combi; |
| reg [PTR_WIDTH - 1:0] fifo_rptr_sync; |
| wire [PTR_WIDTH - 1:0] fifo_wptr_gray_sync; |
| wire [PTR_WIDTH - 1:0] fifo_rptr_gray_sync; |
| reg [PTR_WIDTH - 1:0] fifo_wptr_gray; |
| reg [PTR_WIDTH - 1:0] fifo_rptr_gray; |
| wire fifo_incr_wptr; |
| wire fifo_incr_rptr; |
| wire empty; |
| wire full_wclk; |
| wire full_rclk; |
| assign wready_o = !full_wclk; |
| assign rvalid_o = !empty; |
| assign fifo_incr_wptr = wvalid_i & wready_o; |
| assign fifo_incr_rptr = rvalid_o & rready_i; |
| always @(posedge clk_wr_i or negedge rst_wr_ni) |
| if (!rst_wr_ni) |
| fifo_wptr <= {PTR_WIDTH {1'b0}}; |
| else if (fifo_incr_wptr) |
| if (fifo_wptr[PTR_WIDTH - 2:0] == DepthMinus1) |
| fifo_wptr <= {~fifo_wptr[PTR_WIDTH - 1], {PTR_WIDTH - 1 {1'b0}}}; |
| else |
| fifo_wptr <= fifo_wptr + {{PTR_WIDTH - 1 {1'b0}}, 1'b1}; |
| function automatic [PTR_WIDTH - 1:0] dec2gray; |
| input reg [PTR_WIDTH - 1:0] decval; |
| reg [PTR_WIDTH - 1:0] decval_sub; |
| reg [PTR_WIDTH - 2:0] decval_in; |
| reg unused_decval_msb; |
| begin |
| decval_sub = (Depth - {1'b0, decval[PTR_WIDTH - 2:0]}) - 1'b1; |
| {unused_decval_msb, decval_in} = (decval[PTR_WIDTH - 1] ? decval_sub : decval); |
| dec2gray = {decval[PTR_WIDTH - 1], {1'b0, decval_in[PTR_WIDTH - 2:1]} ^ decval_in[PTR_WIDTH - 2:0]}; |
| end |
| endfunction |
| always @(posedge clk_wr_i or negedge rst_wr_ni) |
| if (!rst_wr_ni) |
| fifo_wptr_gray <= {PTR_WIDTH {1'b0}}; |
| else if (fifo_incr_wptr) |
| if (fifo_wptr[PTR_WIDTH - 2:0] == DepthMinus1) |
| fifo_wptr_gray <= dec2gray({~fifo_wptr[PTR_WIDTH - 1], {PTR_WIDTH - 1 {1'b0}}}); |
| else |
| fifo_wptr_gray <= dec2gray(fifo_wptr + {{PTR_WIDTH - 1 {1'b0}}, 1'b1}); |
| prim_generic_flop_2sync #(.Width(PTR_WIDTH)) sync_wptr( |
| .clk_i(clk_rd_i), |
| .rst_ni(rst_rd_ni), |
| .d_i(fifo_wptr_gray), |
| .q_o(fifo_wptr_gray_sync) |
| ); |
| function automatic [PTR_WIDTH - 1:0] gray2dec; |
| input reg [PTR_WIDTH - 1:0] grayval; |
| reg [PTR_WIDTH - 2:0] dec_tmp; |
| reg [PTR_WIDTH - 2:0] dec_tmp_sub; |
| reg unused_decsub_msb; |
| begin |
| dec_tmp[PTR_WIDTH - 2] = grayval[PTR_WIDTH - 2]; |
| begin : sv2v_autoblock_74 |
| reg signed [31:0] i; |
| for (i = PTR_WIDTH - 3; i >= 0; i = i - 1) |
| dec_tmp[i] = dec_tmp[i + 1] ^ grayval[i]; |
| end |
| {unused_decsub_msb, dec_tmp_sub} = (Depth - {1'b0, dec_tmp}) - 1'b1; |
| if (grayval[PTR_WIDTH - 1]) |
| gray2dec = {1'b1, dec_tmp_sub}; |
| else |
| gray2dec = {1'b0, dec_tmp}; |
| end |
| endfunction |
| assign fifo_wptr_sync_combi = gray2dec(fifo_wptr_gray_sync); |
| always @(posedge clk_rd_i or negedge rst_rd_ni) |
| if (!rst_rd_ni) |
| fifo_rptr <= {PTR_WIDTH {1'b0}}; |
| else if (fifo_incr_rptr) |
| if (fifo_rptr[PTR_WIDTH - 2:0] == DepthMinus1) |
| fifo_rptr <= {~fifo_rptr[PTR_WIDTH - 1], {PTR_WIDTH - 1 {1'b0}}}; |
| else |
| fifo_rptr <= fifo_rptr + {{PTR_WIDTH - 1 {1'b0}}, 1'b1}; |
| always @(posedge clk_rd_i or negedge rst_rd_ni) |
| if (!rst_rd_ni) |
| fifo_rptr_gray <= {PTR_WIDTH {1'b0}}; |
| else if (fifo_incr_rptr) |
| if (fifo_rptr[PTR_WIDTH - 2:0] == DepthMinus1) |
| fifo_rptr_gray <= dec2gray({~fifo_rptr[PTR_WIDTH - 1], {PTR_WIDTH - 1 {1'b0}}}); |
| else |
| fifo_rptr_gray <= dec2gray(fifo_rptr + {{PTR_WIDTH - 1 {1'b0}}, 1'b1}); |
| prim_generic_flop_2sync #(.Width(PTR_WIDTH)) sync_rptr( |
| .clk_i(clk_wr_i), |
| .rst_ni(rst_wr_ni), |
| .d_i(fifo_rptr_gray), |
| .q_o(fifo_rptr_gray_sync) |
| ); |
| always @(posedge clk_wr_i or negedge rst_wr_ni) |
| if (!rst_wr_ni) |
| fifo_rptr_sync <= {PTR_WIDTH {1'b0}}; |
| else |
| fifo_rptr_sync <= gray2dec(fifo_rptr_gray_sync); |
| assign full_wclk = fifo_wptr == (fifo_rptr_sync ^ {1'b1, {PTR_WIDTH - 1 {1'b0}}}); |
| assign full_rclk = fifo_wptr_sync_combi == (fifo_rptr ^ {1'b1, {PTR_WIDTH - 1 {1'b0}}}); |
| wire wptr_msb; |
| wire rptr_sync_msb; |
| wire [PTRV_W - 1:0] wptr_value; |
| wire [PTRV_W - 1:0] rptr_sync_value; |
| assign wptr_msb = fifo_wptr[PTR_WIDTH - 1]; |
| assign rptr_sync_msb = fifo_rptr_sync[PTR_WIDTH - 1]; |
| assign wptr_value = fifo_wptr[0+:PTRV_W]; |
| assign rptr_sync_value = fifo_rptr_sync[0+:PTRV_W]; |
| function automatic [DepthW - 1:0] sv2v_cast_37EEB_unsigned; |
| input reg [DepthW - 1:0] inp; |
| sv2v_cast_37EEB_unsigned = inp; |
| endfunction |
| function automatic [DepthW - 1:0] sv2v_cast_37EEB; |
| input reg [DepthW - 1:0] inp; |
| sv2v_cast_37EEB = inp; |
| endfunction |
| assign wdepth_o = (full_wclk ? sv2v_cast_37EEB_unsigned(Depth) : (wptr_msb == rptr_sync_msb ? sv2v_cast_37EEB(wptr_value) - sv2v_cast_37EEB(rptr_sync_value) : (sv2v_cast_37EEB_unsigned(Depth) - sv2v_cast_37EEB(rptr_sync_value)) + sv2v_cast_37EEB(wptr_value))); |
| assign empty = fifo_wptr_sync_combi == fifo_rptr; |
| wire rptr_msb; |
| wire wptr_sync_msb; |
| wire [PTRV_W - 1:0] rptr_value; |
| wire [PTRV_W - 1:0] wptr_sync_value; |
| assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH - 1]; |
| assign rptr_msb = fifo_rptr[PTR_WIDTH - 1]; |
| assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; |
| assign rptr_value = fifo_rptr[0+:PTRV_W]; |
| assign rdepth_o = (full_rclk ? sv2v_cast_37EEB_unsigned(Depth) : (wptr_sync_msb == rptr_msb ? sv2v_cast_37EEB(wptr_sync_value) - sv2v_cast_37EEB(rptr_value) : (sv2v_cast_37EEB_unsigned(Depth) - sv2v_cast_37EEB(rptr_value)) + sv2v_cast_37EEB(wptr_sync_value))); |
| reg [Width - 1:0] storage [0:Depth - 1]; |
| always @(posedge clk_wr_i) |
| if (fifo_incr_wptr) |
| storage[fifo_wptr[PTR_WIDTH - 2:0]] <= wdata_i; |
| assign rdata_o = storage[fifo_rptr[PTR_WIDTH - 2:0]]; |
| endmodule |
| module prim_fifo_sync ( |
| clk_i, |
| rst_ni, |
| clr_i, |
| wvalid_i, |
| wready_o, |
| wdata_i, |
| rvalid_o, |
| rready_i, |
| rdata_o, |
| depth_o |
| ); |
| parameter [31:0] Width = 16; |
| parameter [0:0] Pass = 1'b1; |
| parameter [31:0] Depth = 4; |
| parameter [0:0] OutputZeroIfEmpty = 1'b1; |
| function automatic integer prim_util_pkg_vbits; |
| input integer value; |
| prim_util_pkg_vbits = (value == 1 ? 1 : $clog2(value)); |
| endfunction |
| localparam signed [31:0] DepthW = prim_util_pkg_vbits(Depth + 1); |
| input clk_i; |
| input rst_ni; |
| input clr_i; |
| input wvalid_i; |
| output wready_o; |
| input [Width - 1:0] wdata_i; |
| output rvalid_o; |
| input rready_i; |
| output [Width - 1:0] rdata_o; |
| output [DepthW - 1:0] depth_o; |
| generate |
| if (Depth == 0) begin : gen_passthru_fifo |
| assign depth_o = 1'b0; |
| assign rvalid_o = wvalid_i; |
| assign rdata_o = wdata_i; |
| assign wready_o = rready_i; |
| wire unused_clr; |
| assign unused_clr = clr_i; |
| end |
| else begin : gen_normal_fifo |
| localparam [31:0] PTRV_W = prim_util_pkg_vbits(Depth); |
| localparam [31:0] PTR_WIDTH = PTRV_W + 1; |
| reg [PTR_WIDTH - 1:0] fifo_wptr; |
| reg [PTR_WIDTH - 1:0] fifo_rptr; |
| wire fifo_incr_wptr; |
| wire fifo_incr_rptr; |
| wire fifo_empty; |
| wire full; |
| wire empty; |
| wire wptr_msb; |
| wire rptr_msb; |
| wire [PTRV_W - 1:0] wptr_value; |
| wire [PTRV_W - 1:0] rptr_value; |
| assign wptr_msb = fifo_wptr[PTR_WIDTH - 1]; |
| assign rptr_msb = fifo_rptr[PTR_WIDTH - 1]; |
| assign wptr_value = fifo_wptr[0+:PTRV_W]; |
| assign rptr_value = fifo_rptr[0+:PTRV_W]; |
| function automatic [DepthW - 1:0] sv2v_cast_37EEB_unsigned; |
| input reg [DepthW - 1:0] inp; |
| sv2v_cast_37EEB_unsigned = inp; |
| endfunction |
| function automatic [DepthW - 1:0] sv2v_cast_37EEB; |
| input reg [DepthW - 1:0] inp; |
| sv2v_cast_37EEB = inp; |
| endfunction |
| assign depth_o = (full ? sv2v_cast_37EEB_unsigned(Depth) : (wptr_msb == rptr_msb ? sv2v_cast_37EEB(wptr_value) - sv2v_cast_37EEB(rptr_value) : (sv2v_cast_37EEB_unsigned(Depth) - sv2v_cast_37EEB(rptr_value)) + sv2v_cast_37EEB(wptr_value))); |
| assign fifo_incr_wptr = wvalid_i & wready_o; |
| assign fifo_incr_rptr = rvalid_o & rready_i; |
| assign wready_o = ~full; |
| assign rvalid_o = ~empty; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| fifo_wptr <= {PTR_WIDTH {1'b0}}; |
| else if (clr_i) |
| fifo_wptr <= {PTR_WIDTH {1'b0}}; |
| else if (fifo_incr_wptr) |
| if (fifo_wptr[PTR_WIDTH - 2:0] == (Depth - 1)) |
| fifo_wptr <= {~fifo_wptr[PTR_WIDTH - 1], {PTR_WIDTH - 1 {1'b0}}}; |
| else |
| fifo_wptr <= fifo_wptr + {{PTR_WIDTH - 1 {1'b0}}, 1'b1}; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| fifo_rptr <= {PTR_WIDTH {1'b0}}; |
| else if (clr_i) |
| fifo_rptr <= {PTR_WIDTH {1'b0}}; |
| else if (fifo_incr_rptr) |
| if (fifo_rptr[PTR_WIDTH - 2:0] == (Depth - 1)) |
| fifo_rptr <= {~fifo_rptr[PTR_WIDTH - 1], {PTR_WIDTH - 1 {1'b0}}}; |
| else |
| fifo_rptr <= fifo_rptr + {{PTR_WIDTH - 1 {1'b0}}, 1'b1}; |
| assign full = fifo_wptr == (fifo_rptr ^ {1'b1, {PTR_WIDTH - 1 {1'b0}}}); |
| assign fifo_empty = fifo_wptr == fifo_rptr; |
| reg [(Depth * Width) - 1:0] storage; |
| wire [Width - 1:0] storage_rdata; |
| if (Depth == 1) begin : gen_depth_eq1 |
| assign storage_rdata = storage[0+:Width]; |
| always @(posedge clk_i) |
| if (fifo_incr_wptr) |
| storage[0+:Width] <= wdata_i; |
| end |
| else begin : gen_depth_gt1 |
| assign storage_rdata = storage[fifo_rptr[PTR_WIDTH - 2:0] * Width+:Width]; |
| always @(posedge clk_i) |
| if (fifo_incr_wptr) |
| storage[fifo_wptr[PTR_WIDTH - 2:0] * Width+:Width] <= wdata_i; |
| end |
| wire [Width - 1:0] rdata_int; |
| if (Pass == 1'b1) begin : gen_pass |
| assign rdata_int = (fifo_empty && wvalid_i ? wdata_i : storage_rdata); |
| assign empty = fifo_empty & ~wvalid_i; |
| end |
| else begin : gen_nopass |
| assign rdata_int = storage_rdata; |
| assign empty = fifo_empty; |
| end |
| if (OutputZeroIfEmpty == 1'b1) begin : gen_output_zero |
| assign rdata_o = (empty ? 'b0 : rdata_int); |
| end |
| else begin : gen_no_output_zero |
| assign rdata_o = rdata_int; |
| end |
| end |
| endgenerate |
| endmodule |
| module prim_filter_ctr ( |
| clk_i, |
| rst_ni, |
| enable_i, |
| filter_i, |
| filter_o |
| ); |
| parameter [31:0] Cycles = 4; |
| input clk_i; |
| input rst_ni; |
| input enable_i; |
| input filter_i; |
| output filter_o; |
| localparam [31:0] CTR_WIDTH = $clog2(Cycles); |
| function automatic [CTR_WIDTH - 1:0] sv2v_cast_AF84E_unsigned; |
| input reg [CTR_WIDTH - 1:0] inp; |
| sv2v_cast_AF84E_unsigned = inp; |
| endfunction |
| localparam [CTR_WIDTH - 1:0] CYCLESM1 = sv2v_cast_AF84E_unsigned(Cycles - 1); |
| reg [CTR_WIDTH - 1:0] diff_ctr_q; |
| wire [CTR_WIDTH - 1:0] diff_ctr_d; |
| reg filter_q; |
| reg stored_value_q; |
| wire update_stored_value; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| filter_q <= 1'b0; |
| else |
| filter_q <= filter_i; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| stored_value_q <= 1'b0; |
| else if (update_stored_value) |
| stored_value_q <= filter_i; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| diff_ctr_q <= {CTR_WIDTH {1'b0}}; |
| else |
| diff_ctr_q <= diff_ctr_d; |
| assign diff_ctr_d = (filter_i != filter_q ? {CTR_WIDTH {1'sb0}} : (diff_ctr_q == CYCLESM1 ? CYCLESM1 : diff_ctr_q + 1'b1)); |
| assign update_stored_value = diff_ctr_d == CYCLESM1; |
| assign filter_o = (enable_i ? stored_value_q : filter_i); |
| endmodule |
| module prim_generic_clock_gating ( |
| clk_i, |
| en_i, |
| test_en_i, |
| clk_o |
| ); |
| input clk_i; |
| input en_i; |
| input test_en_i; |
| output wire clk_o; |
| reg en_latch; |
| /*always @(clk_i or en_i or test_en_i) |
| if (!clk_i) |
| en_latch = en_i | test_en_i; |
| //else |
| //en_latch = 1; |
| assign clk_o = en_latch & clk_i;*/ |
| sky130_fd_sc_hd__dlclkp_1 CG( .CLK(clk_i), .GCLK(clk_o), .GATE(en_i | test_en_i)); |
| /*sky130_fd_sc_hd__dlclkp cell_1 ( |
| .GCLK(clk_o), |
| .GATE(en_i), |
| .CLK(clk_i) |
| );*/ |
| endmodule |
| |
| /*`ifndef SKY130_FD_SC_HD__UDP_DLATCH_P_V |
| `define SKY130_FD_SC_HD__UDP_DLATCH_P_V |
| |
| `timescale 1ns / 1ps |
| //`default_nettype none |
| |
| `ifdef NO_PRIMITIVES |
| //`include "./sky130_fd_sc_hd__udp_dlatch_p.blackbox.v" |
| `else |
| primitive sky130_fd_sc_hd__udp_dlatch$P ( |
| Q , |
| D , |
| GATE |
| ); |
| |
| output Q ; |
| input D ; |
| input GATE; |
| |
| reg Q; |
| |
| table |
| // D GATE : Qt : Qt+1 |
| ? 0 : ? : - ; // hold |
| 0 1 : ? : 0 ; // pass 0 |
| 1 1 : ? : 1 ; // pass 1 |
| 0 x : 0 : 0 ; // reduce pessimism |
| 1 x : 1 : 1 ; // reduce pessimism |
| endtable |
| endprimitive |
| `endif // NO_PRIMITIVES |
| |
| `default_nettype wire |
| `endif // SKY130_FD_SC_HD__UDP_DLATCH_P_V |
| */ |
| |
| /*`ifndef SKY130_FD_SC_HD__DLCLKP_FUNCTIONAL_V |
| `define SKY130_FD_SC_HD__DLCLKP_FUNCTIONAL_V |
| |
| |
| `timescale 1ns / 1ps |
| //`default_nettype none |
| |
| // Import user defined primitives. |
| //`include "../../models/udp_dlatch_p/sky130_fd_sc_hd__udp_dlatch_p.v" |
| |
| `celldefine |
| module sky130_fd_sc_hd__dlclkp ( |
| GCLK, |
| GATE, |
| CLK |
| ); |
| |
| // Module ports |
| output GCLK; |
| input GATE; |
| input CLK ; |
| |
| // Local signals |
| wire m0 ; |
| wire clkn; |
| |
| // Name Output Other arguments |
| not not0 (clkn , CLK ); |
| sky130_fd_sc_hd__udp_dlatch$P dlatch0 (m0 , GATE, clkn ); |
| and and0 (GCLK , m0, CLK ); |
| |
| endmodule |
| `endcelldefine |
| |
| `default_nettype wire |
| `endif // SKY130_FD_SC_HD__DLCLKP_FUNCTIONAL_V |
| */ |
| module prim_generic_clock_inv ( |
| clk_i, |
| scanmode_i, |
| clk_no |
| ); |
| parameter [0:0] HasScanMode = 1'b1; |
| input clk_i; |
| input scanmode_i; |
| output wire clk_no; |
| generate |
| if (HasScanMode) begin : gen_scan |
| prim_generic_clock_mux2 i_dft_tck_mux( |
| .clk0_i(~clk_i), |
| .clk1_i(clk_i), |
| .sel_i(scanmode_i), |
| .clk_o(clk_no) |
| ); |
| end |
| else begin : gen_noscan |
| wire unused_scanmode; |
| assign unused_scanmode = scanmode_i; |
| assign clk_no = ~clk_i; |
| end |
| endgenerate |
| endmodule |
| module prim_generic_clock_mux2 ( |
| clk0_i, |
| clk1_i, |
| sel_i, |
| clk_o |
| ); |
| input clk0_i; |
| input clk1_i; |
| input sel_i; |
| output wire clk_o; |
| assign clk_o = (sel_i ? clk1_i : clk0_i); |
| endmodule |
| module prim_generic_flop ( |
| clk_i, |
| rst_ni, |
| d_i, |
| q_o |
| ); |
| parameter signed [31:0] Width = 1; |
| localparam signed [31:0] WidthSubOne = Width - 1; |
| parameter [WidthSubOne:0] ResetValue = 0; |
| input clk_i; |
| input rst_ni; |
| input [Width - 1:0] d_i; |
| output reg [Width - 1:0] q_o; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| q_o <= ResetValue; |
| else |
| q_o <= d_i; |
| endmodule |
| module prim_generic_flop_2sync ( |
| clk_i, |
| rst_ni, |
| d_i, |
| q_o |
| ); |
| parameter signed [31:0] Width = 16; |
| localparam signed [31:0] WidthSubOne = Width - 1; |
| parameter [WidthSubOne:0] ResetValue = 1'sb0; |
| input clk_i; |
| input rst_ni; |
| input [Width - 1:0] d_i; |
| output wire [Width - 1:0] q_o; |
| wire [Width - 1:0] intq; |
| prim_generic_flop #( |
| .Width(Width), |
| .ResetValue(ResetValue) |
| ) u_sync_1( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .d_i(d_i), |
| .q_o(intq) |
| ); |
| prim_generic_flop #( |
| .Width(Width), |
| .ResetValue(ResetValue) |
| ) u_sync_2( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .d_i(intq), |
| .q_o(q_o) |
| ); |
| endmodule |
| module prim_intr_hw ( |
| clk_i, |
| rst_ni, |
| event_intr_i, |
| reg2hw_intr_enable_q_i, |
| reg2hw_intr_test_q_i, |
| reg2hw_intr_test_qe_i, |
| reg2hw_intr_state_q_i, |
| hw2reg_intr_state_de_o, |
| hw2reg_intr_state_d_o, |
| intr_o |
| ); |
| parameter [31:0] Width = 1; |
| parameter [0:0] FlopOutput = 1; |
| input clk_i; |
| input rst_ni; |
| input [Width - 1:0] event_intr_i; |
| input [Width - 1:0] reg2hw_intr_enable_q_i; |
| input [Width - 1:0] reg2hw_intr_test_q_i; |
| input reg2hw_intr_test_qe_i; |
| input [Width - 1:0] reg2hw_intr_state_q_i; |
| output hw2reg_intr_state_de_o; |
| output [Width - 1:0] hw2reg_intr_state_d_o; |
| output reg [Width - 1:0] intr_o; |
| wire [Width - 1:0] new_event; |
| assign new_event = ({Width {reg2hw_intr_test_qe_i}} & reg2hw_intr_test_q_i) | event_intr_i; |
| assign hw2reg_intr_state_de_o = |new_event; |
| assign hw2reg_intr_state_d_o = new_event | reg2hw_intr_state_q_i; |
| generate |
| if (FlopOutput == 1) begin : gen_flop_intr_output |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| intr_o <= 1'b0; |
| else |
| intr_o <= reg2hw_intr_state_q_i & reg2hw_intr_enable_q_i; |
| end |
| else begin : gen_intr_passthrough_output |
| wire unused_clk; |
| wire unused_rst_n; |
| assign unused_clk = clk_i; |
| assign unused_rst_n = rst_ni; |
| always @(*) intr_o = reg2hw_intr_state_q_i & reg2hw_intr_enable_q_i; |
| end |
| endgenerate |
| endmodule |
| module prim_subreg ( |
| clk_i, |
| rst_ni, |
| we, |
| wd, |
| de, |
| d, |
| qe, |
| q, |
| qs |
| ); |
| parameter signed [31:0] DW = 32; |
| parameter _sv2v_width_SWACCESS = 16; |
| parameter [_sv2v_width_SWACCESS - 1:0] SWACCESS = "RW"; |
| parameter [DW - 1:0] RESVAL = 1'sb0; |
| input clk_i; |
| input rst_ni; |
| input we; |
| input [DW - 1:0] wd; |
| input de; |
| input [DW - 1:0] d; |
| output reg qe; |
| output reg [DW - 1:0] q; |
| output wire [DW - 1:0] qs; |
| wire wr_en; |
| wire [DW - 1:0] wr_data; |
| prim_subreg_arb #( |
| .DW(DW), |
| ._sv2v_width_SWACCESS(_sv2v_width_SWACCESS), |
| .SWACCESS(SWACCESS) |
| ) wr_en_data_arb( |
| .we(we), |
| .wd(wd), |
| .de(de), |
| .d(d), |
| .q(q), |
| .wr_en(wr_en), |
| .wr_data(wr_data) |
| ); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| qe <= 1'b0; |
| else |
| qe <= we; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| q <= RESVAL; |
| else if (wr_en) |
| q <= wr_data; |
| assign qs = q; |
| endmodule |
| module prim_subreg_arb ( |
| we, |
| wd, |
| de, |
| d, |
| q, |
| wr_en, |
| wr_data |
| ); |
| parameter signed [31:0] DW = 32; |
| parameter _sv2v_width_SWACCESS = 16; |
| parameter [_sv2v_width_SWACCESS - 1:0] SWACCESS = "RW"; |
| input we; |
| input [DW - 1:0] wd; |
| input de; |
| input [DW - 1:0] d; |
| input [DW - 1:0] q; |
| output wire wr_en; |
| output wire [DW - 1:0] wr_data; |
| generate |
| if ((SWACCESS == "RW") || (SWACCESS == "WO")) begin : gen_w |
| assign wr_en = we | de; |
| assign wr_data = (we == 1'b1 ? wd : d); |
| wire [DW - 1:0] unused_q; |
| assign unused_q = q; |
| end |
| else if (SWACCESS == "RO") begin : gen_ro |
| assign wr_en = de; |
| assign wr_data = d; |
| wire unused_we; |
| wire [DW - 1:0] unused_wd; |
| wire [DW - 1:0] unused_q; |
| assign unused_we = we; |
| assign unused_wd = wd; |
| assign unused_q = q; |
| end |
| else if (SWACCESS == "W1S") begin : gen_w1s |
| assign wr_en = we | de; |
| assign wr_data = (de ? d : q) | (we ? wd : {DW {1'sb0}}); |
| end |
| else if (SWACCESS == "W1C") begin : gen_w1c |
| assign wr_en = we | de; |
| assign wr_data = (de ? d : q) & (we ? ~wd : {DW {1'sb1}}); |
| end |
| else if (SWACCESS == "W0C") begin : gen_w0c |
| assign wr_en = we | de; |
| assign wr_data = (de ? d : q) & (we ? wd : {DW {1'sb1}}); |
| end |
| else if (SWACCESS == "RC") begin : gen_rc |
| assign wr_en = we | de; |
| assign wr_data = (de ? d : q) & (we ? {DW {1'sb0}} : {DW {1'sb1}}); |
| wire [DW - 1:0] unused_wd; |
| assign unused_wd = wd; |
| end |
| else begin : gen_hw |
| assign wr_en = de; |
| assign wr_data = d; |
| wire unused_we; |
| wire [DW - 1:0] unused_wd; |
| wire [DW - 1:0] unused_q; |
| assign unused_we = we; |
| assign unused_wd = wd; |
| assign unused_q = q; |
| end |
| endgenerate |
| endmodule |
| module prim_subreg_ext ( |
| re, |
| we, |
| wd, |
| d, |
| qe, |
| qre, |
| q, |
| qs |
| ); |
| parameter [31:0] DW = 32; |
| input re; |
| input we; |
| input [DW - 1:0] wd; |
| input [DW - 1:0] d; |
| output wire qe; |
| output wire qre; |
| output wire [DW - 1:0] q; |
| output wire [DW - 1:0] qs; |
| assign qs = d; |
| assign q = wd; |
| assign qe = we; |
| assign qre = re; |
| endmodule |
| module debug_rom ( |
| clk_i, |
| req_i, |
| addr_i, |
| rdata_o |
| ); |
| input wire clk_i; |
| input wire req_i; |
| input wire [63:0] addr_i; |
| output reg [63:0] rdata_o; |
| localparam [31:0] RomSize = 19; |
| wire [(RomSize * 64) - 1:0] mem = {64'h000000007b200073, 64'h7b2024737b302573, 64'h10852423f1402473, 64'ha85ff06f7b202473, 64'h7b30257310052223, 64'h001000737b202473, 64'h7b30257310052623, 64'h00c5151300c55513, 64'h00000517fd5ff06f, 64'hfa041ce300247413, 64'h4004440300a40433, 64'hf140247302041c63, 64'h0014741340044403, 64'h00a4043310852023, 64'hf140247300c51513, 64'h00c5551300000517, 64'h7b3510737b241073, 64'h0ff0000f04c0006f, 64'h07c0006f00c0006f}; |
| reg [4:0] addr_q; |
| always @(posedge clk_i) |
| if (req_i) |
| addr_q <= addr_i[7:3]; |
| function automatic [4:0] sv2v_cast_5_unsigned; |
| input reg [4:0] inp; |
| sv2v_cast_5_unsigned = inp; |
| endfunction |
| always @(*) begin : p_outmux |
| rdata_o = {64 {1'sb0}}; |
| if (addr_q < sv2v_cast_5_unsigned(RomSize)) |
| rdata_o = mem[addr_q * 64+:64]; |
| end |
| endmodule |
| module dm_csrs ( |
| clk_i, |
| rst_ni, |
| testmode_i, |
| dmi_rst_ni, |
| dmi_req_valid_i, |
| dmi_req_ready_o, |
| dmi_req_i, |
| dmi_resp_valid_o, |
| dmi_resp_ready_i, |
| dmi_resp_o, |
| ndmreset_o, |
| dmactive_o, |
| hartinfo_i, |
| halted_i, |
| unavailable_i, |
| resumeack_i, |
| hartsel_o, |
| haltreq_o, |
| resumereq_o, |
| clear_resumeack_o, |
| cmd_valid_o, |
| cmd_o, |
| cmderror_valid_i, |
| cmderror_i, |
| cmdbusy_i, |
| progbuf_o, |
| data_o, |
| data_i, |
| data_valid_i, |
| sbaddress_o, |
| sbaddress_i, |
| sbaddress_write_valid_o, |
| sbreadonaddr_o, |
| sbautoincrement_o, |
| sbaccess_o, |
| sbreadondata_o, |
| sbdata_o, |
| sbdata_read_valid_o, |
| sbdata_write_valid_o, |
| sbdata_i, |
| sbdata_valid_i, |
| sbbusy_i, |
| sberror_valid_i, |
| sberror_i |
| ); |
| parameter [31:0] NrHarts = 1; |
| parameter [31:0] BusWidth = 32; |
| parameter [NrHarts - 1:0] SelectableHarts = {NrHarts {1'b1}}; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire testmode_i; |
| input wire dmi_rst_ni; |
| input wire dmi_req_valid_i; |
| output wire dmi_req_ready_o; |
| input wire [40:0] dmi_req_i; |
| output wire dmi_resp_valid_o; |
| input wire dmi_resp_ready_i; |
| output wire [33:0] dmi_resp_o; |
| output wire ndmreset_o; |
| output wire dmactive_o; |
| input wire [(NrHarts * 32) - 1:0] hartinfo_i; |
| input wire [NrHarts - 1:0] halted_i; |
| input wire [NrHarts - 1:0] unavailable_i; |
| input wire [NrHarts - 1:0] resumeack_i; |
| output wire [19:0] hartsel_o; |
| output reg [NrHarts - 1:0] haltreq_o; |
| output reg [NrHarts - 1:0] resumereq_o; |
| output reg clear_resumeack_o; |
| output wire cmd_valid_o; |
| output wire [31:0] cmd_o; |
| input wire cmderror_valid_i; |
| input wire [2:0] cmderror_i; |
| input wire cmdbusy_i; |
| localparam [4:0] dm_ProgBufSize = 5'h08; |
| output wire [(dm_ProgBufSize * 32) - 1:0] progbuf_o; |
| localparam [3:0] dm_DataCount = 4'h2; |
| output wire [(dm_DataCount * 32) - 1:0] data_o; |
| input wire [(dm_DataCount * 32) - 1:0] data_i; |
| input wire data_valid_i; |
| output wire [BusWidth - 1:0] sbaddress_o; |
| input wire [BusWidth - 1:0] sbaddress_i; |
| output reg sbaddress_write_valid_o; |
| output wire sbreadonaddr_o; |
| output wire sbautoincrement_o; |
| output wire [2:0] sbaccess_o; |
| output wire sbreadondata_o; |
| output wire [BusWidth - 1:0] sbdata_o; |
| output reg sbdata_read_valid_o; |
| output reg sbdata_write_valid_o; |
| input wire [BusWidth - 1:0] sbdata_i; |
| input wire sbdata_valid_i; |
| input wire sbbusy_i; |
| input wire sberror_valid_i; |
| input wire [2:0] sberror_i; |
| localparam [31:0] HartSelLen = (NrHarts == 1 ? 1 : $clog2(NrHarts)); |
| localparam [31:0] NrHartsAligned = 2 ** HartSelLen; |
| wire [1:0] dtm_op; |
| function automatic [1:0] sv2v_cast_2; |
| input reg [1:0] inp; |
| sv2v_cast_2 = inp; |
| endfunction |
| assign dtm_op = sv2v_cast_2(dmi_req_i[33-:2]); |
| reg [31:0] resp_queue_data; |
| localparam [7:0] dm_Data0 = 8'h04; |
| function automatic [7:0] sv2v_cast_8; |
| input reg [7:0] inp; |
| sv2v_cast_8 = inp; |
| endfunction |
| localparam [7:0] DataEnd = sv2v_cast_8((dm_Data0 + {4'b0000, dm_DataCount}) - 8'h01); |
| localparam [7:0] dm_ProgBuf0 = 8'h20; |
| localparam [7:0] ProgBufEnd = sv2v_cast_8((dm_ProgBuf0 + {4'b0000, dm_ProgBufSize}) - 8'h01); |
| reg [31:0] haltsum0; |
| reg [31:0] haltsum1; |
| reg [31:0] haltsum2; |
| reg [31:0] haltsum3; |
| reg [((((NrHarts - 1) / 32) + 1) * 32) - 1:0] halted; |
| reg [(((NrHarts - 1) / 32) >= 0 ? ((((NrHarts - 1) / 32) + 1) * 32) - 1 : ((1 - ((NrHarts - 1) / 32)) * 32) + ((((NrHarts - 1) / 32) * 32) - 1)):(((NrHarts - 1) / 32) >= 0 ? 0 : ((NrHarts - 1) / 32) * 32)] halted_reshaped0; |
| reg [(((NrHarts - 1) / 1024) >= 0 ? ((((NrHarts - 1) / 1024) + 1) * 32) - 1 : ((1 - ((NrHarts - 1) / 1024)) * 32) + ((((NrHarts - 1) / 1024) * 32) - 1)):(((NrHarts - 1) / 1024) >= 0 ? 0 : ((NrHarts - 1) / 1024) * 32)] halted_reshaped1; |
| reg [(((NrHarts - 1) / 32768) >= 0 ? ((((NrHarts - 1) / 32768) + 1) * 32) - 1 : ((1 - ((NrHarts - 1) / 32768)) * 32) + ((((NrHarts - 1) / 32768) * 32) - 1)):(((NrHarts - 1) / 32768) >= 0 ? 0 : ((NrHarts - 1) / 32768) * 32)] halted_reshaped2; |
| reg [((((NrHarts - 1) / 1024) + 1) * 32) - 1:0] halted_flat1; |
| reg [((((NrHarts - 1) / 32768) + 1) * 32) - 1:0] halted_flat2; |
| reg [31:0] halted_flat3; |
| reg [14:0] hartsel_idx0; |
| function automatic [14:0] sv2v_cast_15_unsigned; |
| input reg [14:0] inp; |
| sv2v_cast_15_unsigned = inp; |
| endfunction |
| always @(*) begin : p_haltsum0 |
| halted = {(((NrHarts - 1) / 32) + 1) * 32 {1'sb0}}; |
| haltsum0 = {32 {1'sb0}}; |
| hartsel_idx0 = hartsel_o[19:5]; |
| halted[NrHarts - 1:0] = halted_i; |
| halted_reshaped0 = halted; |
| if (hartsel_idx0 < sv2v_cast_15_unsigned(((NrHarts - 1) / 32) + 1)) |
| haltsum0 = halted_reshaped0[(((NrHarts - 1) / 32) >= 0 ? hartsel_idx0 : ((NrHarts - 1) / 32) - hartsel_idx0) * 32+:32]; |
| end |
| reg [9:0] hartsel_idx1; |
| function automatic [9:0] sv2v_cast_10_unsigned; |
| input reg [9:0] inp; |
| sv2v_cast_10_unsigned = inp; |
| endfunction |
| always @(*) begin : p_reduction1 |
| halted_flat1 = {(((NrHarts - 1) / 1024) + 1) * 32 {1'sb0}}; |
| haltsum1 = {32 {1'sb0}}; |
| hartsel_idx1 = hartsel_o[19:10]; |
| begin : sv2v_autoblock_75 |
| reg [31:0] k; |
| for (k = 0; k < (((NrHarts - 1) / 32) + 1); k = k + 1) |
| halted_flat1[k] = |halted_reshaped0[(((NrHarts - 1) / 32) >= 0 ? k : ((NrHarts - 1) / 32) - k) * 32+:32]; |
| end |
| halted_reshaped1 = halted_flat1; |
| if (hartsel_idx1 < sv2v_cast_10_unsigned(((NrHarts - 1) / 1024) + 1)) |
| haltsum1 = halted_reshaped1[(((NrHarts - 1) / 1024) >= 0 ? hartsel_idx1 : ((NrHarts - 1) / 1024) - hartsel_idx1) * 32+:32]; |
| end |
| reg [4:0] hartsel_idx2; |
| function automatic [4:0] sv2v_cast_5_unsigned; |
| input reg [4:0] inp; |
| sv2v_cast_5_unsigned = inp; |
| endfunction |
| always @(*) begin : p_reduction2 |
| halted_flat2 = {(((NrHarts - 1) / 32768) + 1) * 32 {1'sb0}}; |
| haltsum2 = {32 {1'sb0}}; |
| hartsel_idx2 = hartsel_o[19:15]; |
| begin : sv2v_autoblock_76 |
| reg [31:0] k; |
| for (k = 0; k < (((NrHarts - 1) / 1024) + 1); k = k + 1) |
| halted_flat2[k] = |halted_reshaped1[(((NrHarts - 1) / 1024) >= 0 ? k : ((NrHarts - 1) / 1024) - k) * 32+:32]; |
| end |
| halted_reshaped2 = halted_flat2; |
| if (hartsel_idx2 < sv2v_cast_5_unsigned(((NrHarts - 1) / 32768) + 1)) |
| haltsum2 = halted_reshaped2[(((NrHarts - 1) / 32768) >= 0 ? hartsel_idx2 : ((NrHarts - 1) / 32768) - hartsel_idx2) * 32+:32]; |
| end |
| always @(*) begin : p_reduction3 |
| halted_flat3 = {32 {1'sb0}}; |
| begin : sv2v_autoblock_77 |
| reg [31:0] k; |
| for (k = 0; k < ((NrHarts / 32768) + 1); k = k + 1) |
| halted_flat3[k] = |halted_reshaped2[(((NrHarts - 1) / 32768) >= 0 ? k : ((NrHarts - 1) / 32768) - k) * 32+:32]; |
| end |
| haltsum3 = halted_flat3; |
| end |
| reg [31:0] dmstatus; |
| reg [31:0] dmcontrol_d; |
| reg [31:0] dmcontrol_q; |
| reg [31:0] abstractcs; |
| reg [2:0] cmderr_d; |
| reg [2:0] cmderr_q; |
| reg [31:0] command_d; |
| reg [31:0] command_q; |
| reg cmd_valid_d; |
| reg cmd_valid_q; |
| reg [31:0] abstractauto_d; |
| reg [31:0] abstractauto_q; |
| reg [31:0] sbcs_d; |
| reg [31:0] sbcs_q; |
| reg [63:0] sbaddr_d; |
| reg [63:0] sbaddr_q; |
| reg [63:0] sbdata_d; |
| reg [63:0] sbdata_q; |
| wire [NrHarts - 1:0] havereset_d; |
| reg [NrHarts - 1:0] havereset_q; |
| reg [(dm_ProgBufSize * 32) - 1:0] progbuf_d; |
| reg [(dm_ProgBufSize * 32) - 1:0] progbuf_q; |
| reg [(dm_DataCount * 32) - 1:0] data_d; |
| reg [(dm_DataCount * 32) - 1:0] data_q; |
| reg [HartSelLen - 1:0] selected_hart; |
| localparam [1:0] dm_DTM_SUCCESS = 2'h0; |
| assign dmi_resp_o[1-:2] = dm_DTM_SUCCESS; |
| assign sbautoincrement_o = sbcs_q[16]; |
| assign sbreadonaddr_o = sbcs_q[20]; |
| assign sbreadondata_o = sbcs_q[15]; |
| assign sbaccess_o = sbcs_q[19-:3]; |
| assign sbdata_o = sbdata_q[BusWidth - 1:0]; |
| assign sbaddress_o = sbaddr_q[BusWidth - 1:0]; |
| assign hartsel_o = {dmcontrol_q[15-:10], dmcontrol_q[25-:10]}; |
| reg [NrHartsAligned - 1:0] havereset_d_aligned; |
| wire [NrHartsAligned - 1:0] havereset_q_aligned; |
| wire [NrHartsAligned - 1:0] resumeack_aligned; |
| wire [NrHartsAligned - 1:0] unavailable_aligned; |
| wire [NrHartsAligned - 1:0] halted_aligned; |
| function automatic [NrHartsAligned - 1:0] sv2v_cast_8FC1C; |
| input reg [NrHartsAligned - 1:0] inp; |
| sv2v_cast_8FC1C = inp; |
| endfunction |
| assign resumeack_aligned = sv2v_cast_8FC1C(resumeack_i); |
| assign unavailable_aligned = sv2v_cast_8FC1C(unavailable_i); |
| assign halted_aligned = sv2v_cast_8FC1C(halted_i); |
| function automatic [NrHarts - 1:0] sv2v_cast_50608; |
| input reg [NrHarts - 1:0] inp; |
| sv2v_cast_50608 = inp; |
| endfunction |
| assign havereset_d = sv2v_cast_50608(havereset_d_aligned); |
| assign havereset_q_aligned = sv2v_cast_8FC1C(havereset_q); |
| reg [(NrHartsAligned * 32) - 1:0] hartinfo_aligned; |
| always @(*) begin : p_hartinfo_align |
| hartinfo_aligned = {NrHartsAligned * 32 {1'sb0}}; |
| hartinfo_aligned[32 * ((NrHarts - 1) - (NrHarts - 1))+:32 * NrHarts] = hartinfo_i; |
| end |
| reg [31:0] sbcs; |
| reg [31:0] dmcontrol; |
| reg [31:0] a_abstractcs; |
| reg [4:0] autoexecdata_idx; |
| function automatic [0:0] sv2v_cast_1; |
| input reg [0:0] inp; |
| sv2v_cast_1 = inp; |
| endfunction |
| function automatic [31:0] sv2v_cast_32; |
| input reg [31:0] inp; |
| sv2v_cast_32 = inp; |
| endfunction |
| function automatic [63:0] sv2v_cast_64; |
| input reg [63:0] inp; |
| sv2v_cast_64 = inp; |
| endfunction |
| function automatic [4:0] sv2v_cast_5; |
| input reg [4:0] inp; |
| sv2v_cast_5 = inp; |
| endfunction |
| function automatic [$clog2(4'h2) - 1:0] sv2v_cast_48325; |
| input reg [$clog2(4'h2) - 1:0] inp; |
| sv2v_cast_48325 = inp; |
| endfunction |
| function automatic [11:0] sv2v_cast_12; |
| input reg [11:0] inp; |
| sv2v_cast_12 = inp; |
| endfunction |
| function automatic [15:0] sv2v_cast_16; |
| input reg [15:0] inp; |
| sv2v_cast_16 = inp; |
| endfunction |
| localparam [7:0] dm_AbstractAuto = 8'h18; |
| localparam [7:0] dm_AbstractCS = 8'h16; |
| localparam [2:0] dm_CmdErrBusy = 1; |
| localparam [2:0] dm_CmdErrNone = 0; |
| localparam [7:0] dm_Command = 8'h17; |
| localparam [7:0] dm_DMControl = 8'h10; |
| localparam [7:0] dm_DMStatus = 8'h11; |
| localparam [1:0] dm_DTM_READ = 2'h1; |
| localparam [1:0] dm_DTM_WRITE = 2'h2; |
| localparam [3:0] dm_DbgVersion013 = 4'h2; |
| localparam [7:0] dm_HaltSum0 = 8'h40; |
| localparam [7:0] dm_HaltSum1 = 8'h13; |
| localparam [7:0] dm_HaltSum2 = 8'h34; |
| localparam [7:0] dm_HaltSum3 = 8'h35; |
| localparam [7:0] dm_Hartinfo = 8'h12; |
| localparam [7:0] dm_SBAddress0 = 8'h39; |
| localparam [7:0] dm_SBAddress1 = 8'h3a; |
| localparam [7:0] dm_SBCS = 8'h38; |
| localparam [7:0] dm_SBData0 = 8'h3c; |
| localparam [7:0] dm_SBData1 = 8'h3d; |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| function automatic [6:0] sv2v_cast_7; |
| input reg [6:0] inp; |
| sv2v_cast_7 = inp; |
| endfunction |
| always @(*) begin : csr_read_write |
| dmstatus = {32 {1'sb0}}; |
| dmstatus[3-:4] = dm_DbgVersion013; |
| dmstatus[7] = 1'b1; |
| dmstatus[5] = 1'b0; |
| dmstatus[19] = havereset_q_aligned[selected_hart]; |
| dmstatus[18] = havereset_q_aligned[selected_hart]; |
| dmstatus[17] = resumeack_aligned[selected_hart]; |
| dmstatus[16] = resumeack_aligned[selected_hart]; |
| dmstatus[13] = unavailable_aligned[selected_hart]; |
| dmstatus[12] = unavailable_aligned[selected_hart]; |
| dmstatus[15] = sv2v_cast_1(sv2v_cast_32(hartsel_o) > (NrHarts - 1)); |
| dmstatus[14] = sv2v_cast_1(sv2v_cast_32(hartsel_o) > (NrHarts - 1)); |
| dmstatus[9] = halted_aligned[selected_hart] & ~unavailable_aligned[selected_hart]; |
| dmstatus[8] = halted_aligned[selected_hart] & ~unavailable_aligned[selected_hart]; |
| dmstatus[11] = ~halted_aligned[selected_hart] & ~unavailable_aligned[selected_hart]; |
| dmstatus[10] = ~halted_aligned[selected_hart] & ~unavailable_aligned[selected_hart]; |
| abstractcs = {32 {1'sb0}}; |
| abstractcs[3-:4] = dm_DataCount; |
| abstractcs[28-:5] = dm_ProgBufSize; |
| abstractcs[12] = cmdbusy_i; |
| abstractcs[10-:3] = cmderr_q; |
| abstractauto_d = abstractauto_q; |
| abstractauto_d[15-:4] = {4 {1'sb0}}; |
| havereset_d_aligned = sv2v_cast_8FC1C(havereset_q); |
| dmcontrol_d = dmcontrol_q; |
| cmderr_d = cmderr_q; |
| command_d = command_q; |
| progbuf_d = progbuf_q; |
| data_d = data_q; |
| sbcs_d = sbcs_q; |
| sbaddr_d = sv2v_cast_64(sbaddress_i); |
| sbdata_d = sbdata_q; |
| resp_queue_data = 32'b00000000000000000000000000000000; |
| cmd_valid_d = 1'b0; |
| sbaddress_write_valid_o = 1'b0; |
| sbdata_read_valid_o = 1'b0; |
| sbdata_write_valid_o = 1'b0; |
| clear_resumeack_o = 1'b0; |
| sbcs = {32 {1'sb0}}; |
| dmcontrol = {32 {1'sb0}}; |
| a_abstractcs = {32 {1'sb0}}; |
| autoexecdata_idx = dmi_req_i[38:34] - sv2v_cast_5(dm_Data0); |
| if ((dmi_req_ready_o && dmi_req_valid_i) && (dtm_op == dm_DTM_READ)) |
| if ((dm_Data0 <= {1'b0, dmi_req_i[40-:7]}) && (DataEnd >= {1'b0, dmi_req_i[40-:7]})) begin |
| resp_queue_data = data_q[sv2v_cast_48325(autoexecdata_idx) * 32+:32]; |
| if (!cmdbusy_i) |
| if (autoexecdata_idx < 12) |
| cmd_valid_d = abstractauto_q[autoexecdata_idx]; |
| end |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_DMControl) |
| resp_queue_data = dmcontrol_q; |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_DMStatus) |
| resp_queue_data = dmstatus; |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_Hartinfo) |
| resp_queue_data = hartinfo_aligned[selected_hart * 32+:32]; |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_AbstractCS) |
| resp_queue_data = abstractcs; |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_AbstractAuto) |
| resp_queue_data = abstractauto_q; |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_Command) |
| resp_queue_data = {32 {1'sb0}}; |
| else if ((dm_ProgBuf0 <= {1'b0, dmi_req_i[40-:7]}) && (ProgBufEnd >= {1'b0, dmi_req_i[40-:7]})) begin |
| resp_queue_data = progbuf_q[dmi_req_i[$clog2(5'h08) + 33:34] * 32+:32]; |
| if (!cmdbusy_i) |
| cmd_valid_d = abstractauto_q[{1'b1, dmi_req_i[37:34]}]; |
| end |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_HaltSum0) |
| resp_queue_data = haltsum0; |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_HaltSum1) |
| resp_queue_data = haltsum1; |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_HaltSum2) |
| resp_queue_data = haltsum2; |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_HaltSum3) |
| resp_queue_data = haltsum3; |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_SBCS) |
| resp_queue_data = sbcs_q; |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_SBAddress0) begin |
| if (sbbusy_i) |
| sbcs_d[22] = 1'b1; |
| else |
| resp_queue_data = sbaddr_q[31:0]; |
| end |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_SBAddress1) begin |
| if (sbbusy_i) |
| sbcs_d[22] = 1'b1; |
| else |
| resp_queue_data = sbaddr_q[63:32]; |
| end |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_SBData0) begin |
| if (sbbusy_i) |
| sbcs_d[22] = 1'b1; |
| else begin |
| sbdata_read_valid_o = sbcs_q[14-:3] == {3 {1'sb0}}; |
| resp_queue_data = sbdata_q[31:0]; |
| end |
| end |
| else if ({1'b0, dmi_req_i[40-:7]} == dm_SBData1) |
| if (sbbusy_i) |
| sbcs_d[22] = 1'b1; |
| else |
| resp_queue_data = sbdata_q[63:32]; |
| if ((dmi_req_ready_o && dmi_req_valid_i) && (dtm_op == dm_DTM_WRITE)) |
| if ((dm_Data0 <= sv2v_cast_8({1'b0, dmi_req_i[40-:7]})) && (DataEnd >= sv2v_cast_8({1'b0, dmi_req_i[40-:7]}))) begin |
| if (!cmdbusy_i && (dm_DataCount > 0)) begin |
| data_d[dmi_req_i[$clog2(4'h2) + 33:34] * 32+:32] = dmi_req_i[31-:32]; |
| if (autoexecdata_idx < 12) |
| cmd_valid_d = abstractauto_q[autoexecdata_idx]; |
| end |
| end |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_DMControl) begin |
| dmcontrol = sv2v_cast_32(dmi_req_i[31-:32]); |
| if (dmcontrol[28]) |
| havereset_d_aligned[selected_hart] = 1'b0; |
| dmcontrol_d = dmi_req_i[31-:32]; |
| end |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_DMStatus) |
| ; |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_Hartinfo) |
| ; |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_AbstractCS) begin |
| a_abstractcs = sv2v_cast_32(dmi_req_i[31-:32]); |
| if (!cmdbusy_i) |
| cmderr_d = sv2v_cast_3(~a_abstractcs[10-:3] & cmderr_q); |
| else if (cmderr_q == dm_CmdErrNone) |
| cmderr_d = dm_CmdErrBusy; |
| end |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_Command) begin |
| if (!cmdbusy_i) begin |
| cmd_valid_d = 1'b1; |
| command_d = sv2v_cast_32(dmi_req_i[31-:32]); |
| end |
| else if (cmderr_q == dm_CmdErrNone) |
| cmderr_d = dm_CmdErrBusy; |
| end |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_AbstractAuto) begin |
| if (!cmdbusy_i) begin |
| abstractauto_d = 32'b00000000000000000000000000000000; |
| abstractauto_d[11-:12] = sv2v_cast_12(dmi_req_i[dm_DataCount - 1:0]); |
| abstractauto_d[31-:16] = sv2v_cast_16(dmi_req_i[dm_ProgBufSize + 15:16]); |
| end |
| else if (cmderr_q == dm_CmdErrNone) |
| cmderr_d = dm_CmdErrBusy; |
| end |
| else if ((dm_ProgBuf0 <= sv2v_cast_8({1'b0, dmi_req_i[40-:7]})) && (ProgBufEnd >= sv2v_cast_8({1'b0, dmi_req_i[40-:7]}))) begin |
| if (!cmdbusy_i) begin |
| progbuf_d[dmi_req_i[$clog2(5'h08) + 33:34] * 32+:32] = dmi_req_i[31-:32]; |
| cmd_valid_d = abstractauto_q[{1'b1, dmi_req_i[37:34]}]; |
| end |
| end |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_SBCS) begin |
| if (sbbusy_i) |
| sbcs_d[22] = 1'b1; |
| else begin |
| sbcs = sv2v_cast_32(dmi_req_i[31-:32]); |
| sbcs_d = sbcs; |
| sbcs_d[22] = sbcs_q[22] & ~sbcs[22]; |
| sbcs_d[14-:3] = sbcs_q[14-:3] & ~sbcs[14-:3]; |
| end |
| end |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_SBAddress0) begin |
| if (sbbusy_i) |
| sbcs_d[22] = 1'b1; |
| else begin |
| sbaddr_d[31:0] = dmi_req_i[31-:32]; |
| sbaddress_write_valid_o = sbcs_q[14-:3] == {3 {1'sb0}}; |
| end |
| end |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_SBAddress1) begin |
| if (sbbusy_i) |
| sbcs_d[22] = 1'b1; |
| else |
| sbaddr_d[63:32] = dmi_req_i[31-:32]; |
| end |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_SBData0) begin |
| if (sbbusy_i) |
| sbcs_d[22] = 1'b1; |
| else begin |
| sbdata_d[31:0] = dmi_req_i[31-:32]; |
| sbdata_write_valid_o = sbcs_q[14-:3] == {3 {1'sb0}}; |
| end |
| end |
| else if (sv2v_cast_8({1'b0, dmi_req_i[40-:7]}) == dm_SBData1) |
| if (sbbusy_i) |
| sbcs_d[22] = 1'b1; |
| else |
| sbdata_d[63:32] = dmi_req_i[31-:32]; |
| if (cmderror_valid_i) |
| cmderr_d = cmderror_i; |
| if (data_valid_i) |
| data_d = data_i; |
| if (ndmreset_o) |
| havereset_d_aligned[NrHarts - 1:0] = {NrHarts {1'sb1}}; |
| if (sberror_valid_i) |
| sbcs_d[14-:3] = sberror_i; |
| if (sbdata_valid_i) |
| sbdata_d = sv2v_cast_64(sbdata_i); |
| dmcontrol_d[26] = 1'b0; |
| dmcontrol_d[29] = 1'b0; |
| dmcontrol_d[3] = 1'b0; |
| dmcontrol_d[2] = 1'b0; |
| dmcontrol_d[27] = 1'sb0; |
| dmcontrol_d[5-:2] = {2 {1'sb0}}; |
| dmcontrol_d[28] = 1'b0; |
| if (!dmcontrol_q[30] && dmcontrol_d[30]) |
| clear_resumeack_o = 1'b1; |
| if (dmcontrol_q[30] && resumeack_i) |
| dmcontrol_d[30] = 1'b0; |
| sbcs_d[31-:3] = 3'd1; |
| sbcs_d[21] = sbbusy_i; |
| sbcs_d[11-:7] = sv2v_cast_7(BusWidth); |
| sbcs_d[4] = 1'b0; |
| sbcs_d[3] = sv2v_cast_1(BusWidth == 32'd64); |
| sbcs_d[2] = sv2v_cast_1(BusWidth == 32'd32); |
| sbcs_d[1] = 1'b0; |
| sbcs_d[0] = 1'b0; |
| sbcs_d[19-:3] = (BusWidth == 32'd64 ? 3'd3 : 3'd2); |
| end |
| function automatic [HartSelLen:0] sv2v_cast_7DE8E_unsigned; |
| input reg [HartSelLen:0] inp; |
| sv2v_cast_7DE8E_unsigned = inp; |
| endfunction |
| always @(*) begin : p_outmux |
| selected_hart = hartsel_o[HartSelLen - 1:0]; |
| haltreq_o = {NrHarts {1'sb0}}; |
| resumereq_o = {NrHarts {1'sb0}}; |
| if (selected_hart < sv2v_cast_7DE8E_unsigned(NrHarts)) begin |
| haltreq_o[selected_hart] = dmcontrol_q[31]; |
| resumereq_o[selected_hart] = dmcontrol_q[30]; |
| end |
| end |
| assign dmactive_o = dmcontrol_q[0]; |
| assign cmd_o = command_q; |
| assign cmd_valid_o = cmd_valid_q; |
| assign progbuf_o = progbuf_q; |
| assign data_o = data_q; |
| assign ndmreset_o = dmcontrol_q[1]; |
| wire unused_testmode; |
| assign unused_testmode = testmode_i; |
| prim_fifo_sync #( |
| .Width(32), |
| .Pass(1'b0), |
| .Depth(2) |
| ) i_fifo( |
| .clk_i(clk_i), |
| .rst_ni(dmi_rst_ni), |
| .clr_i(1'b0), |
| .wdata_i(resp_queue_data), |
| .wvalid_i(dmi_req_valid_i), |
| .wready_o(dmi_req_ready_o), |
| .rdata_o(dmi_resp_o[33-:32]), |
| .rvalid_o(dmi_resp_valid_o), |
| .rready_i(dmi_resp_ready_i), |
| .depth_o() |
| ); |
| always @(posedge clk_i or negedge rst_ni) begin : p_regs |
| if (!rst_ni) begin |
| dmcontrol_q <= {32 {1'sb0}}; |
| cmderr_q <= dm_CmdErrNone; |
| command_q <= {32 {1'sb0}}; |
| cmd_valid_q <= 1'sb0; |
| abstractauto_q <= {32 {1'sb0}}; |
| progbuf_q <= {dm_ProgBufSize * 32 {1'sb0}}; |
| data_q <= {dm_DataCount * 32 {1'sb0}}; |
| sbcs_q <= {32 {1'sb0}}; |
| sbaddr_q <= {64 {1'sb0}}; |
| sbdata_q <= {64 {1'sb0}}; |
| havereset_q <= {NrHarts {1'sb1}}; |
| end |
| else begin |
| havereset_q <= SelectableHarts & havereset_d; |
| if (!dmcontrol_q[0]) begin |
| dmcontrol_q[31] <= 1'sb0; |
| dmcontrol_q[30] <= 1'sb0; |
| dmcontrol_q[29] <= 1'sb0; |
| dmcontrol_q[28] <= 1'sb0; |
| dmcontrol_q[27] <= 1'sb0; |
| dmcontrol_q[26] <= 1'sb0; |
| dmcontrol_q[25-:10] <= {10 {1'sb0}}; |
| dmcontrol_q[15-:10] <= {10 {1'sb0}}; |
| dmcontrol_q[5-:2] <= {2 {1'sb0}}; |
| dmcontrol_q[3] <= 1'sb0; |
| dmcontrol_q[2] <= 1'sb0; |
| dmcontrol_q[1] <= 1'sb0; |
| dmcontrol_q[0] <= dmcontrol_d[0]; |
| cmderr_q <= dm_CmdErrNone; |
| command_q <= {32 {1'sb0}}; |
| cmd_valid_q <= 1'sb0; |
| abstractauto_q <= {32 {1'sb0}}; |
| progbuf_q <= {dm_ProgBufSize * 32 {1'sb0}}; |
| data_q <= {dm_DataCount * 32 {1'sb0}}; |
| sbcs_q <= {32 {1'sb0}}; |
| sbaddr_q <= {64 {1'sb0}}; |
| sbdata_q <= {64 {1'sb0}}; |
| end |
| else begin |
| dmcontrol_q <= dmcontrol_d; |
| cmderr_q <= cmderr_d; |
| command_q <= command_d; |
| cmd_valid_q <= cmd_valid_d; |
| abstractauto_q <= abstractauto_d; |
| progbuf_q <= progbuf_d; |
| data_q <= data_d; |
| sbcs_q <= sbcs_d; |
| sbaddr_q <= sbaddr_d; |
| sbdata_q <= sbdata_d; |
| end |
| end |
| end |
| endmodule |
| module dm_mem ( |
| clk_i, |
| rst_ni, |
| debug_req_o, |
| hartsel_i, |
| haltreq_i, |
| resumereq_i, |
| clear_resumeack_i, |
| halted_o, |
| resuming_o, |
| progbuf_i, |
| data_i, |
| data_o, |
| data_valid_o, |
| cmd_valid_i, |
| cmd_i, |
| cmderror_valid_o, |
| cmderror_o, |
| cmdbusy_o, |
| req_i, |
| we_i, |
| addr_i, |
| wdata_i, |
| be_i, |
| rdata_o |
| ); |
| parameter [31:0] NrHarts = 1; |
| parameter [31:0] BusWidth = 32; |
| parameter [NrHarts - 1:0] SelectableHarts = {NrHarts {1'b1}}; |
| parameter [31:0] DmBaseAddress = 1'sb0; |
| input wire clk_i; |
| input wire rst_ni; |
| output wire [NrHarts - 1:0] debug_req_o; |
| input wire [19:0] hartsel_i; |
| input wire [NrHarts - 1:0] haltreq_i; |
| input wire [NrHarts - 1:0] resumereq_i; |
| input wire clear_resumeack_i; |
| output wire [NrHarts - 1:0] halted_o; |
| output wire [NrHarts - 1:0] resuming_o; |
| localparam [4:0] dm_ProgBufSize = 5'h08; |
| input wire [(dm_ProgBufSize * 32) - 1:0] progbuf_i; |
| localparam [3:0] dm_DataCount = 4'h2; |
| input wire [(dm_DataCount * 32) - 1:0] data_i; |
| output reg [(dm_DataCount * 32) - 1:0] data_o; |
| output reg data_valid_o; |
| input wire cmd_valid_i; |
| input wire [31:0] cmd_i; |
| output reg cmderror_valid_o; |
| output reg [2:0] cmderror_o; |
| output reg cmdbusy_o; |
| input wire req_i; |
| input wire we_i; |
| input wire [BusWidth - 1:0] addr_i; |
| input wire [BusWidth - 1:0] wdata_i; |
| input wire [(BusWidth / 8) - 1:0] be_i; |
| output wire [BusWidth - 1:0] rdata_o; |
| localparam [31:0] DbgAddressBits = 12; |
| localparam [31:0] HartSelLen = (NrHarts == 1 ? 1 : $clog2(NrHarts)); |
| localparam [31:0] NrHartsAligned = 2 ** HartSelLen; |
| localparam [31:0] MaxAar = (BusWidth == 64 ? 4 : 3); |
| localparam [0:0] HasSndScratch = DmBaseAddress != 0; |
| localparam [4:0] LoadBaseAddr = (DmBaseAddress == 0 ? 5'd0 : 5'd10); |
| localparam [11:0] dm_DataAddr = 12'h380; |
| localparam [DbgAddressBits - 1:0] DataBaseAddr = dm_DataAddr; |
| localparam [DbgAddressBits - 1:0] DataEndAddr = (dm_DataAddr + (4 * dm_DataCount)) - 1; |
| localparam [DbgAddressBits - 1:0] ProgBufBaseAddr = dm_DataAddr - (4 * dm_ProgBufSize); |
| localparam [DbgAddressBits - 1:0] ProgBufEndAddr = dm_DataAddr - 1; |
| localparam [DbgAddressBits - 1:0] AbstractCmdBaseAddr = ProgBufBaseAddr - 40; |
| localparam [DbgAddressBits - 1:0] AbstractCmdEndAddr = ProgBufBaseAddr - 1; |
| localparam [DbgAddressBits - 1:0] WhereToAddr = 'h300; |
| localparam [DbgAddressBits - 1:0] FlagsBaseAddr = 'h400; |
| localparam [DbgAddressBits - 1:0] FlagsEndAddr = 'h7ff; |
| localparam [DbgAddressBits - 1:0] HaltedAddr = 'h100; |
| localparam [DbgAddressBits - 1:0] GoingAddr = 'h104; |
| localparam [DbgAddressBits - 1:0] ResumingAddr = 'h108; |
| localparam [DbgAddressBits - 1:0] ExceptionAddr = 'h10c; |
| wire [((dm_ProgBufSize / 2) * 64) - 1:0] progbuf; |
| reg [511:0] abstract_cmd; |
| wire [NrHarts - 1:0] halted_d; |
| reg [NrHarts - 1:0] halted_q; |
| wire [NrHarts - 1:0] resuming_d; |
| reg [NrHarts - 1:0] resuming_q; |
| reg resume; |
| reg go; |
| reg going; |
| reg exception; |
| reg unsupported_command; |
| wire [63:0] rom_rdata; |
| reg [63:0] rdata_d; |
| reg [63:0] rdata_q; |
| reg word_enable32_q; |
| wire [HartSelLen - 1:0] hartsel; |
| wire [HartSelLen - 1:0] wdata_hartsel; |
| assign hartsel = hartsel_i[HartSelLen - 1:0]; |
| assign wdata_hartsel = wdata_i[HartSelLen - 1:0]; |
| wire [NrHartsAligned - 1:0] resumereq_aligned; |
| wire [NrHartsAligned - 1:0] haltreq_aligned; |
| reg [NrHartsAligned - 1:0] halted_d_aligned; |
| wire [NrHartsAligned - 1:0] halted_q_aligned; |
| reg [NrHartsAligned - 1:0] halted_aligned; |
| wire [NrHartsAligned - 1:0] resumereq_wdata_aligned; |
| reg [NrHartsAligned - 1:0] resuming_d_aligned; |
| wire [NrHartsAligned - 1:0] resuming_q_aligned; |
| function automatic [NrHartsAligned - 1:0] sv2v_cast_8FC1C; |
| input reg [NrHartsAligned - 1:0] inp; |
| sv2v_cast_8FC1C = inp; |
| endfunction |
| assign resumereq_aligned = sv2v_cast_8FC1C(resumereq_i); |
| assign haltreq_aligned = sv2v_cast_8FC1C(haltreq_i); |
| assign resumereq_wdata_aligned = sv2v_cast_8FC1C(resumereq_i); |
| assign halted_q_aligned = sv2v_cast_8FC1C(halted_q); |
| function automatic [NrHarts - 1:0] sv2v_cast_50608; |
| input reg [NrHarts - 1:0] inp; |
| sv2v_cast_50608 = inp; |
| endfunction |
| assign halted_d = sv2v_cast_50608(halted_d_aligned); |
| assign resuming_q_aligned = sv2v_cast_8FC1C(resuming_q); |
| assign resuming_d = sv2v_cast_50608(resuming_d_aligned); |
| wire fwd_rom_d; |
| reg fwd_rom_q; |
| wire [23:0] ac_ar; |
| function automatic [23:0] sv2v_cast_24; |
| input reg [23:0] inp; |
| sv2v_cast_24 = inp; |
| endfunction |
| assign ac_ar = sv2v_cast_24(cmd_i[23-:24]); |
| assign debug_req_o = haltreq_i; |
| assign halted_o = halted_q; |
| assign resuming_o = resuming_q; |
| assign progbuf = progbuf_i; |
| reg [1:0] state_d; |
| reg [1:0] state_q; |
| localparam [1:0] CmdExecuting = 3; |
| localparam [1:0] Go = 1; |
| localparam [2:0] Idle = 0; |
| localparam [1:0] Resume = 2; |
| localparam [2:0] dm_CmdErrNone = 0; |
| localparam [2:0] dm_CmdErrNotSupported = 2; |
| localparam [2:0] dm_CmdErrorException = 3; |
| localparam [2:0] dm_CmdErrorHaltResume = 4; |
| always @(*) begin : p_hart_ctrl_queue |
| cmderror_valid_o = 1'b0; |
| cmderror_o = dm_CmdErrNone; |
| state_d = state_q; |
| go = 1'b0; |
| resume = 1'b0; |
| cmdbusy_o = 1'b1; |
| case (state_q) |
| Idle: begin |
| cmdbusy_o = 1'b0; |
| if ((cmd_valid_i && halted_q_aligned[hartsel]) && !unsupported_command) |
| state_d = Go; |
| else if (cmd_valid_i) begin |
| cmderror_valid_o = 1'b1; |
| cmderror_o = dm_CmdErrorHaltResume; |
| end |
| if (((resumereq_aligned[hartsel] && !resuming_q_aligned[hartsel]) && !haltreq_aligned[hartsel]) && halted_q_aligned[hartsel]) |
| state_d = Resume; |
| end |
| Go: begin |
| cmdbusy_o = 1'b1; |
| go = 1'b1; |
| if (going) |
| state_d = CmdExecuting; |
| end |
| Resume: begin |
| cmdbusy_o = 1'b1; |
| resume = 1'b1; |
| if (resuming_q_aligned[hartsel]) |
| state_d = Idle; |
| end |
| CmdExecuting: begin |
| cmdbusy_o = 1'b1; |
| go = 1'b0; |
| if (halted_aligned[hartsel]) |
| state_d = Idle; |
| end |
| default: |
| ; |
| endcase |
| if (unsupported_command && cmd_valid_i) begin |
| cmderror_valid_o = 1'b1; |
| cmderror_o = dm_CmdErrNotSupported; |
| end |
| if (exception) begin |
| cmderror_valid_o = 1'b1; |
| cmderror_o = dm_CmdErrorException; |
| end |
| end |
| wire [63:0] word_mux; |
| assign word_mux = (fwd_rom_q ? rom_rdata : rdata_q); |
| generate |
| if (BusWidth == 64) begin : gen_word_mux64 |
| assign rdata_o = word_mux; |
| end |
| else begin : gen_word_mux32 |
| assign rdata_o = (word_enable32_q ? word_mux[32+:32] : word_mux[0+:32]); |
| end |
| endgenerate |
| reg [63:0] data_bits; |
| reg [63:0] rdata; |
| function automatic [20:0] sv2v_cast_21; |
| input reg [20:0] inp; |
| sv2v_cast_21 = inp; |
| endfunction |
| function automatic [$clog2(5'h08) - 1:0] sv2v_cast_D971A; |
| input reg [$clog2(5'h08) - 1:0] inp; |
| sv2v_cast_D971A = inp; |
| endfunction |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| function automatic [11:0] sv2v_cast_12; |
| input reg [11:0] inp; |
| sv2v_cast_12 = inp; |
| endfunction |
| localparam [7:0] dm_AccessRegister = 8'h00; |
| localparam [63:0] dm_HaltAddress = 64'h0000000000000800; |
| localparam [63:0] dm_ResumeAddress = dm_HaltAddress + 4; |
| function automatic [31:0] dm_jal; |
| input reg [4:0] rd; |
| input reg [20:0] imm; |
| dm_jal = {imm[20], imm[10:1], imm[11], imm[19:12], rd, 7'h6f}; |
| endfunction |
| always @(*) begin : p_rw_logic |
| halted_d_aligned = sv2v_cast_8FC1C(halted_q); |
| resuming_d_aligned = sv2v_cast_8FC1C(resuming_q); |
| rdata_d = rdata_q; |
| data_bits = data_i; |
| rdata = {64 {1'sb0}}; |
| data_valid_o = 1'b0; |
| exception = 1'b0; |
| halted_aligned = {NrHartsAligned {1'sb0}}; |
| going = 1'b0; |
| if (clear_resumeack_i) |
| resuming_d_aligned[hartsel] = 1'b0; |
| if (req_i) |
| if (we_i) begin |
| if (addr_i[DbgAddressBits - 1:0] == HaltedAddr) begin |
| halted_aligned[wdata_hartsel] = 1'b1; |
| halted_d_aligned[wdata_hartsel] = 1'b1; |
| end |
| else if (addr_i[DbgAddressBits - 1:0] == GoingAddr) |
| going = 1'b1; |
| else if (addr_i[DbgAddressBits - 1:0] == ResumingAddr) begin |
| halted_d_aligned[wdata_hartsel] = 1'b0; |
| resuming_d_aligned[wdata_hartsel] = 1'b1; |
| end |
| else if (addr_i[DbgAddressBits - 1:0] == ExceptionAddr) |
| exception = 1'b1; |
| else if ((DataBaseAddr <= addr_i[DbgAddressBits - 1:0]) && (DataEndAddr >= addr_i[DbgAddressBits - 1:0])) begin |
| data_valid_o = 1'b1; |
| begin : sv2v_autoblock_78 |
| reg signed [31:0] i; |
| for (i = 0; i < (BusWidth / 8); i = i + 1) |
| if (be_i[i]) |
| data_bits[i * 8+:8] = wdata_i[i * 8+:8]; |
| end |
| end |
| end |
| else if (addr_i[DbgAddressBits - 1:0] == WhereToAddr) begin |
| if (resumereq_wdata_aligned[wdata_hartsel]) |
| rdata_d = {32'b00000000000000000000000000000000, dm_jal(1'sb0, sv2v_cast_21(dm_ResumeAddress[11:0]) - sv2v_cast_21(WhereToAddr))}; |
| if (cmdbusy_o) |
| if (((cmd_i[31-:8] == dm_AccessRegister) && !ac_ar[17]) && ac_ar[18]) |
| rdata_d = {32'b00000000000000000000000000000000, dm_jal(1'sb0, sv2v_cast_21(ProgBufBaseAddr) - sv2v_cast_21(WhereToAddr))}; |
| else |
| rdata_d = {32'b00000000000000000000000000000000, dm_jal(1'sb0, sv2v_cast_21(AbstractCmdBaseAddr) - sv2v_cast_21(WhereToAddr))}; |
| end |
| else if ((DataBaseAddr <= addr_i[DbgAddressBits - 1:0]) && (DataEndAddr >= addr_i[DbgAddressBits - 1:0])) |
| rdata_d = {data_i[sv2v_cast_D971A((addr_i[DbgAddressBits - 1:3] - DataBaseAddr[DbgAddressBits - 1:3]) + 1'b1) * 32+:32], data_i[sv2v_cast_D971A(addr_i[DbgAddressBits - 1:3] - DataBaseAddr[DbgAddressBits - 1:3]) * 32+:32]}; |
| else if ((ProgBufBaseAddr <= addr_i[DbgAddressBits - 1:0]) && (ProgBufEndAddr >= addr_i[DbgAddressBits - 1:0])) |
| rdata_d = progbuf[sv2v_cast_D971A(addr_i[DbgAddressBits - 1:3] - ProgBufBaseAddr[DbgAddressBits - 1:3]) * 64+:64]; |
| else if ((AbstractCmdBaseAddr <= addr_i[DbgAddressBits - 1:0]) && (AbstractCmdEndAddr >= addr_i[DbgAddressBits - 1:0])) |
| rdata_d = abstract_cmd[sv2v_cast_3(addr_i[DbgAddressBits - 1:3] - AbstractCmdBaseAddr[DbgAddressBits - 1:3]) * 64+:64]; |
| else if ((FlagsBaseAddr <= addr_i[DbgAddressBits - 1:0]) && (FlagsEndAddr >= addr_i[DbgAddressBits - 1:0])) begin |
| if (({addr_i[DbgAddressBits - 1:3], 3'b000} - FlagsBaseAddr[DbgAddressBits - 1:0]) == (sv2v_cast_12(hartsel) & {{DbgAddressBits - 3 {1'b1}}, 3'b000})) |
| rdata[(sv2v_cast_12(hartsel) & sv2v_cast_12(3'b111)) * 8+:8] = {6'b000000, resume, go}; |
| rdata_d = rdata; |
| end |
| data_o = data_bits; |
| end |
| function automatic [31:0] sv2v_cast_32; |
| input reg [31:0] inp; |
| sv2v_cast_32 = inp; |
| endfunction |
| localparam [11:0] dm_CSR_DSCRATCH0 = 12'h7b2; |
| localparam [11:0] dm_CSR_DSCRATCH1 = 12'h7b3; |
| function automatic [31:0] dm_auipc; |
| input reg [4:0] rd; |
| input reg [20:0] imm; |
| dm_auipc = {imm[20], imm[10:1], imm[11], imm[19:12], rd, 7'h17}; |
| endfunction |
| function automatic [31:0] dm_csrr; |
| input reg [11:0] csr; |
| input reg [4:0] dest; |
| dm_csrr = {csr, 5'h00, 3'h2, dest, 7'h73}; |
| endfunction |
| function automatic [31:0] dm_csrw; |
| input reg [11:0] csr; |
| input reg [4:0] rs1; |
| dm_csrw = {csr, rs1, 3'h1, 5'h00, 7'h73}; |
| endfunction |
| function automatic [31:0] dm_ebreak; |
| input _sv2v_unused; |
| dm_ebreak = 32'h00100073; |
| endfunction |
| function automatic [31:0] dm_float_load; |
| input reg [2:0] size; |
| input reg [4:0] dest; |
| input reg [4:0] base; |
| input reg [11:0] offset; |
| dm_float_load = {offset[11:0], base, size, dest, 7'b0000111}; |
| endfunction |
| function automatic [31:0] dm_float_store; |
| input reg [2:0] size; |
| input reg [4:0] src; |
| input reg [4:0] base; |
| input reg [11:0] offset; |
| dm_float_store = {offset[11:5], src, base, size, offset[4:0], 7'b0100111}; |
| endfunction |
| function automatic [31:0] dm_illegal; |
| input _sv2v_unused; |
| dm_illegal = 32'h00000000; |
| endfunction |
| function automatic [31:0] dm_load; |
| input reg [2:0] size; |
| input reg [4:0] dest; |
| input reg [4:0] base; |
| input reg [11:0] offset; |
| dm_load = {offset[11:0], base, size, dest, 7'h03}; |
| endfunction |
| function automatic [31:0] dm_nop; |
| input _sv2v_unused; |
| dm_nop = 32'h00000013; |
| endfunction |
| function automatic [31:0] dm_slli; |
| input reg [4:0] rd; |
| input reg [4:0] rs1; |
| input reg [5:0] shamt; |
| dm_slli = {6'b000000, shamt[5:0], rs1, 3'h1, rd, 7'h13}; |
| endfunction |
| function automatic [31:0] dm_srli; |
| input reg [4:0] rd; |
| input reg [4:0] rs1; |
| input reg [5:0] shamt; |
| dm_srli = {6'b000000, shamt[5:0], rs1, 3'h5, rd, 7'h13}; |
| endfunction |
| function automatic [31:0] dm_store; |
| input reg [2:0] size; |
| input reg [4:0] src; |
| input reg [4:0] base; |
| input reg [11:0] offset; |
| dm_store = {offset[11:5], src, base, size, offset[4:0], 7'h23}; |
| endfunction |
| always @(*) begin : p_abstract_cmd_rom |
| unsupported_command = 1'b0; |
| abstract_cmd[31-:32] = dm_illegal(0); |
| abstract_cmd[63-:32] = (HasSndScratch ? dm_auipc(5'd10, 1'sb0) : dm_nop(0)); |
| abstract_cmd[95-:32] = (HasSndScratch ? dm_srli(5'd10, 5'd10, 6'd12) : dm_nop(0)); |
| abstract_cmd[127-:32] = (HasSndScratch ? dm_slli(5'd10, 5'd10, 6'd12) : dm_nop(0)); |
| abstract_cmd[159-:32] = dm_nop(0); |
| abstract_cmd[191-:32] = dm_nop(0); |
| abstract_cmd[223-:32] = dm_nop(0); |
| abstract_cmd[255-:32] = dm_nop(0); |
| abstract_cmd[287-:32] = (HasSndScratch ? dm_csrr(dm_CSR_DSCRATCH1, 5'd10) : dm_nop(0)); |
| abstract_cmd[319-:32] = dm_ebreak(0); |
| abstract_cmd[320+:192] = {192 {1'sb0}}; |
| case (cmd_i[31-:8]) |
| dm_AccessRegister: begin |
| if (((sv2v_cast_32(ac_ar[22-:3]) < MaxAar) && ac_ar[17]) && ac_ar[16]) begin |
| abstract_cmd[31-:32] = (HasSndScratch ? dm_csrr(dm_CSR_DSCRATCH1, 5'd10) : dm_nop(0)); |
| if (ac_ar[15:14] != {2 {1'sb0}}) begin |
| abstract_cmd[31-:32] = dm_ebreak(0); |
| unsupported_command = 1'b1; |
| end |
| else if (((HasSndScratch && ac_ar[12]) && !ac_ar[5]) && (ac_ar[4:0] == 5'd10)) begin |
| abstract_cmd[159-:32] = dm_csrw(dm_CSR_DSCRATCH0, 5'd8); |
| abstract_cmd[191-:32] = dm_load(ac_ar[22-:3], 5'd8, LoadBaseAddr, dm_DataAddr); |
| abstract_cmd[223-:32] = dm_csrw(dm_CSR_DSCRATCH1, 5'd8); |
| abstract_cmd[255-:32] = dm_csrr(dm_CSR_DSCRATCH0, 5'd8); |
| end |
| else if (ac_ar[12]) begin |
| if (ac_ar[5]) |
| abstract_cmd[159-:32] = dm_float_load(ac_ar[22-:3], ac_ar[4:0], LoadBaseAddr, dm_DataAddr); |
| else |
| abstract_cmd[159-:32] = dm_load(ac_ar[22-:3], ac_ar[4:0], LoadBaseAddr, dm_DataAddr); |
| end |
| else begin |
| abstract_cmd[159-:32] = dm_csrw(dm_CSR_DSCRATCH0, 5'd8); |
| abstract_cmd[191-:32] = dm_load(ac_ar[22-:3], 5'd8, LoadBaseAddr, dm_DataAddr); |
| abstract_cmd[223-:32] = dm_csrw(sv2v_cast_12(ac_ar[11:0]), 5'd8); |
| abstract_cmd[255-:32] = dm_csrr(dm_CSR_DSCRATCH0, 5'd8); |
| end |
| end |
| else if (((sv2v_cast_32(ac_ar[22-:3]) < MaxAar) && ac_ar[17]) && !ac_ar[16]) begin |
| abstract_cmd[31-:32] = (HasSndScratch ? dm_csrr(dm_CSR_DSCRATCH1, LoadBaseAddr) : dm_nop(0)); |
| if (ac_ar[15:14] != {2 {1'sb0}}) begin |
| abstract_cmd[31-:32] = dm_ebreak(0); |
| unsupported_command = 1'b1; |
| end |
| else if (((HasSndScratch && ac_ar[12]) && !ac_ar[5]) && (ac_ar[4:0] == 5'd10)) begin |
| abstract_cmd[159-:32] = dm_csrw(dm_CSR_DSCRATCH0, 5'd8); |
| abstract_cmd[191-:32] = dm_csrr(dm_CSR_DSCRATCH1, 5'd8); |
| abstract_cmd[223-:32] = dm_store(ac_ar[22-:3], 5'd8, LoadBaseAddr, dm_DataAddr); |
| abstract_cmd[255-:32] = dm_csrr(dm_CSR_DSCRATCH0, 5'd8); |
| end |
| else if (ac_ar[12]) begin |
| if (ac_ar[5]) |
| abstract_cmd[159-:32] = dm_float_store(ac_ar[22-:3], ac_ar[4:0], LoadBaseAddr, dm_DataAddr); |
| else |
| abstract_cmd[159-:32] = dm_store(ac_ar[22-:3], ac_ar[4:0], LoadBaseAddr, dm_DataAddr); |
| end |
| else begin |
| abstract_cmd[159-:32] = dm_csrw(dm_CSR_DSCRATCH0, 5'd8); |
| abstract_cmd[191-:32] = dm_csrr(sv2v_cast_12(ac_ar[11:0]), 5'd8); |
| abstract_cmd[223-:32] = dm_store(ac_ar[22-:3], 5'd8, LoadBaseAddr, dm_DataAddr); |
| abstract_cmd[255-:32] = dm_csrr(dm_CSR_DSCRATCH0, 5'd8); |
| end |
| end |
| else if ((sv2v_cast_32(ac_ar[22-:3]) >= MaxAar) || (ac_ar[19] == 1'b1)) begin |
| abstract_cmd[31-:32] = dm_ebreak(0); |
| unsupported_command = 1'b1; |
| end |
| if (ac_ar[18] && !unsupported_command) |
| abstract_cmd[319-:32] = dm_nop(0); |
| end |
| default: begin |
| abstract_cmd[31-:32] = dm_ebreak(0); |
| unsupported_command = 1'b1; |
| end |
| endcase |
| end |
| wire [63:0] rom_addr; |
| function automatic [63:0] sv2v_cast_64; |
| input reg [63:0] inp; |
| sv2v_cast_64 = inp; |
| endfunction |
| assign rom_addr = sv2v_cast_64(addr_i); |
| generate |
| if (HasSndScratch) begin : gen_rom_snd_scratch |
| debug_rom i_debug_rom( |
| .clk_i(clk_i), |
| .req_i(req_i), |
| .addr_i(rom_addr), |
| .rdata_o(rom_rdata) |
| ); |
| end |
| /*else begin : gen_rom_one_scratch |
| debug_rom_one_scratch i_debug_rom( |
| .clk_i(clk_i), |
| .req_i(req_i), |
| .addr_i(rom_addr), |
| .rdata_o(rom_rdata) |
| ); |
| end*/ |
| endgenerate |
| function automatic [0:0] sv2v_cast_1; |
| input reg [0:0] inp; |
| sv2v_cast_1 = inp; |
| endfunction |
| assign fwd_rom_d = sv2v_cast_1(addr_i[DbgAddressBits - 1:0] >= dm_HaltAddress[DbgAddressBits - 1:0]); |
| always @(posedge clk_i or negedge rst_ni) begin : p_regs |
| if (!rst_ni) begin |
| fwd_rom_q <= 1'b0; |
| rdata_q <= {64 {1'sb0}}; |
| state_q <= Idle; |
| word_enable32_q <= 1'b0; |
| end |
| else begin |
| fwd_rom_q <= fwd_rom_d; |
| rdata_q <= rdata_d; |
| state_q <= state_d; |
| word_enable32_q <= addr_i[2]; |
| end |
| end |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| halted_q <= 1'b0; |
| resuming_q <= 1'b0; |
| end |
| else begin |
| halted_q <= SelectableHarts & halted_d; |
| resuming_q <= SelectableHarts & resuming_d; |
| end |
| endmodule |
| module dm_sba ( |
| clk_i, |
| rst_ni, |
| dmactive_i, |
| master_req_o, |
| master_add_o, |
| master_we_o, |
| master_wdata_o, |
| master_be_o, |
| master_gnt_i, |
| master_r_valid_i, |
| master_r_rdata_i, |
| sbaddress_i, |
| sbaddress_write_valid_i, |
| sbreadonaddr_i, |
| sbaddress_o, |
| sbautoincrement_i, |
| sbaccess_i, |
| sbreadondata_i, |
| sbdata_i, |
| sbdata_read_valid_i, |
| sbdata_write_valid_i, |
| sbdata_o, |
| sbdata_valid_o, |
| sbbusy_o, |
| sberror_valid_o, |
| sberror_o |
| ); |
| parameter [31:0] BusWidth = 32; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire dmactive_i; |
| output wire master_req_o; |
| output wire [BusWidth - 1:0] master_add_o; |
| output wire master_we_o; |
| output wire [BusWidth - 1:0] master_wdata_o; |
| output wire [(BusWidth / 8) - 1:0] master_be_o; |
| input wire master_gnt_i; |
| input wire master_r_valid_i; |
| input wire [BusWidth - 1:0] master_r_rdata_i; |
| input wire [BusWidth - 1:0] sbaddress_i; |
| input wire sbaddress_write_valid_i; |
| input wire sbreadonaddr_i; |
| output reg [BusWidth - 1:0] sbaddress_o; |
| input wire sbautoincrement_i; |
| input wire [2:0] sbaccess_i; |
| input wire sbreadondata_i; |
| input wire [BusWidth - 1:0] sbdata_i; |
| input wire sbdata_read_valid_i; |
| input wire sbdata_write_valid_i; |
| output wire [BusWidth - 1:0] sbdata_o; |
| output wire sbdata_valid_o; |
| output wire sbbusy_o; |
| output reg sberror_valid_o; |
| output reg [2:0] sberror_o; |
| reg [2:0] state_d; |
| reg [2:0] state_q; |
| reg [BusWidth - 1:0] address; |
| reg req; |
| wire gnt; |
| reg we; |
| reg [(BusWidth / 8) - 1:0] be; |
| reg [$clog2(BusWidth / 8) - 1:0] be_idx; |
| function automatic [0:0] sv2v_cast_1; |
| input reg [0:0] inp; |
| sv2v_cast_1 = inp; |
| endfunction |
| localparam [2:0] Idle = 0; |
| assign sbbusy_o = sv2v_cast_1(state_q != Idle); |
| localparam [2:0] Read = 1; |
| localparam [2:0] WaitRead = 3; |
| localparam [2:0] WaitWrite = 4; |
| localparam [2:0] Write = 2; |
| function automatic signed [31:0] sv2v_cast_32_signed; |
| input reg signed [31:0] inp; |
| sv2v_cast_32_signed = inp; |
| endfunction |
| always @(*) begin : p_fsm |
| req = 1'b0; |
| address = sbaddress_i; |
| we = 1'b0; |
| be = {BusWidth / 8 {1'sb0}}; |
| be_idx = sbaddress_i[$clog2(BusWidth / 8) - 1:0]; |
| sberror_o = {3 {1'sb0}}; |
| sberror_valid_o = 1'b0; |
| sbaddress_o = sbaddress_i; |
| state_d = state_q; |
| case (state_q) |
| Idle: begin |
| if (sbaddress_write_valid_i && sbreadonaddr_i) |
| state_d = Read; |
| if (sbdata_write_valid_i) |
| state_d = Write; |
| if (sbdata_read_valid_i && sbreadondata_i) |
| state_d = Read; |
| end |
| Read: begin |
| req = 1'b1; |
| if (gnt) |
| state_d = WaitRead; |
| end |
| Write: begin |
| req = 1'b1; |
| we = 1'b1; |
| case (sbaccess_i) |
| 3'b000: be[be_idx] = 1'sb1; |
| 3'b001: be[sv2v_cast_32_signed({be_idx[$clog2(BusWidth / 8) - 1:1], 1'b0})+:2] = {2 {1'sb1}}; |
| 3'b010: |
| if (BusWidth == 32'd64) |
| be[sv2v_cast_32_signed({be_idx[$clog2(BusWidth / 8) - 1], 2'h0})+:4] = {4 {1'sb1}}; |
| else |
| be = {BusWidth / 8 {1'sb1}}; |
| 3'b011: be = {BusWidth / 8 {1'sb1}}; |
| default: |
| ; |
| endcase |
| if (gnt) |
| state_d = WaitWrite; |
| end |
| WaitRead: |
| if (sbdata_valid_o) begin |
| state_d = Idle; |
| if (sbautoincrement_i) |
| sbaddress_o = sbaddress_i + (32'h00000001 << sbaccess_i); |
| end |
| WaitWrite: |
| if (sbdata_valid_o) begin |
| state_d = Idle; |
| if (sbautoincrement_i) |
| sbaddress_o = sbaddress_i + (32'h00000001 << sbaccess_i); |
| end |
| default: state_d = Idle; |
| endcase |
| if ((sbaccess_i > 3) && (state_q != Idle)) begin |
| req = 1'b0; |
| state_d = Idle; |
| sberror_valid_o = 1'b1; |
| sberror_o = 3'd3; |
| end |
| end |
| always @(posedge clk_i or negedge rst_ni) begin : p_regs |
| if (!rst_ni) |
| state_q <= Idle; |
| else |
| state_q <= state_d; |
| end |
| assign master_req_o = req; |
| assign master_add_o = address[BusWidth - 1:0]; |
| assign master_we_o = we; |
| assign master_wdata_o = sbdata_i[BusWidth - 1:0]; |
| assign master_be_o = be[(BusWidth / 8) - 1:0]; |
| assign gnt = master_gnt_i; |
| assign sbdata_valid_o = master_r_valid_i; |
| assign sbdata_o = master_r_rdata_i[BusWidth - 1:0]; |
| endmodule |
| module dmi_cdc ( |
| tck_i, |
| trst_ni, |
| jtag_dmi_req_i, |
| jtag_dmi_ready_o, |
| jtag_dmi_valid_i, |
| jtag_dmi_resp_o, |
| jtag_dmi_valid_o, |
| jtag_dmi_ready_i, |
| clk_i, |
| rst_ni, |
| core_dmi_req_o, |
| core_dmi_valid_o, |
| core_dmi_ready_i, |
| core_dmi_resp_i, |
| core_dmi_ready_o, |
| core_dmi_valid_i |
| ); |
| input wire tck_i; |
| input wire trst_ni; |
| input wire [40:0] jtag_dmi_req_i; |
| output wire jtag_dmi_ready_o; |
| input wire jtag_dmi_valid_i; |
| output wire [33:0] jtag_dmi_resp_o; |
| output wire jtag_dmi_valid_o; |
| input wire jtag_dmi_ready_i; |
| input wire clk_i; |
| input wire rst_ni; |
| output wire [40:0] core_dmi_req_o; |
| output wire core_dmi_valid_o; |
| input wire core_dmi_ready_i; |
| input wire [33:0] core_dmi_resp_i; |
| output wire core_dmi_ready_o; |
| input wire core_dmi_valid_i; |
| prim_fifo_async #( |
| .Width(41), |
| .Depth(4) |
| ) i_cdc_req( |
| .clk_wr_i(tck_i), |
| .rst_wr_ni(trst_ni), |
| .wvalid_i(jtag_dmi_valid_i), |
| .wready_o(jtag_dmi_ready_o), |
| .wdata_i(jtag_dmi_req_i), |
| .wdepth_o(), |
| .clk_rd_i(clk_i), |
| .rst_rd_ni(rst_ni), |
| .rvalid_o(core_dmi_valid_o), |
| .rready_i(core_dmi_ready_i), |
| .rdata_o(core_dmi_req_o), |
| .rdepth_o() |
| ); |
| prim_fifo_async #( |
| .Width(34), |
| .Depth(4) |
| ) i_cdc_resp( |
| .clk_wr_i(clk_i), |
| .rst_wr_ni(rst_ni), |
| .wvalid_i(core_dmi_valid_i), |
| .wready_o(core_dmi_ready_o), |
| .wdata_i(core_dmi_resp_i), |
| .wdepth_o(), |
| .clk_rd_i(tck_i), |
| .rst_rd_ni(trst_ni), |
| .rvalid_o(jtag_dmi_valid_o), |
| .rready_i(jtag_dmi_ready_i), |
| .rdata_o(jtag_dmi_resp_o), |
| .rdepth_o() |
| ); |
| endmodule |
| module dmi_jtag ( |
| clk_i, |
| rst_ni, |
| testmode_i, |
| dmi_rst_no, |
| dmi_req_o, |
| dmi_req_valid_o, |
| dmi_req_ready_i, |
| dmi_resp_i, |
| dmi_resp_ready_o, |
| dmi_resp_valid_i, |
| tck_i, |
| tms_i, |
| trst_ni, |
| td_i, |
| td_o, |
| tdo_oe_o |
| ); |
| parameter [31:0] IdcodeValue = 32'h00000001; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire testmode_i; |
| output wire dmi_rst_no; |
| output wire [40:0] dmi_req_o; |
| output wire dmi_req_valid_o; |
| input wire dmi_req_ready_i; |
| input wire [33:0] dmi_resp_i; |
| output wire dmi_resp_ready_o; |
| input wire dmi_resp_valid_i; |
| input wire tck_i; |
| input wire tms_i; |
| input wire trst_ni; |
| input wire td_i; |
| output wire td_o; |
| output wire tdo_oe_o; |
| assign dmi_rst_no = rst_ni; |
| wire test_logic_reset; |
| wire shift_dr; |
| wire update_dr; |
| wire capture_dr; |
| wire dmi_access; |
| wire dtmcs_select; |
| wire dmi_reset; |
| wire dmi_tdi; |
| wire dmi_tdo; |
| wire [40:0] dmi_req; |
| wire dmi_req_ready; |
| reg dmi_req_valid; |
| wire [33:0] dmi_resp; |
| wire dmi_resp_valid; |
| wire dmi_resp_ready; |
| reg [2:0] state_d; |
| reg [2:0] state_q; |
| reg [40:0] dr_d; |
| reg [40:0] dr_q; |
| reg [6:0] address_d; |
| reg [6:0] address_q; |
| reg [31:0] data_d; |
| reg [31:0] data_q; |
| wire [40:0] dmi; |
| function automatic [40:0] sv2v_cast_41; |
| input reg [40:0] inp; |
| sv2v_cast_41 = inp; |
| endfunction |
| assign dmi = sv2v_cast_41(dr_q); |
| assign dmi_req[40-:7] = address_q; |
| assign dmi_req[31-:32] = data_q; |
| localparam [2:0] Write = 3; |
| localparam [1:0] dm_DTM_READ = 2'h1; |
| localparam [1:0] dm_DTM_WRITE = 2'h2; |
| assign dmi_req[33-:2] = (state_q == Write ? dm_DTM_WRITE : dm_DTM_READ); |
| assign dmi_resp_ready = 1'b1; |
| reg error_dmi_busy; |
| reg [1:0] error_d; |
| reg [1:0] error_q; |
| localparam [1:0] DMIBusy = 2'h3; |
| localparam [1:0] DMINoError = 2'h0; |
| localparam [2:0] Idle = 0; |
| localparam [2:0] Read = 1; |
| localparam [2:0] WaitReadValid = 2; |
| function automatic [1:0] sv2v_cast_2; |
| input reg [1:0] inp; |
| sv2v_cast_2 = inp; |
| endfunction |
| always @(*) begin : p_fsm |
| error_dmi_busy = 1'b0; |
| state_d = state_q; |
| address_d = address_q; |
| data_d = data_q; |
| error_d = error_q; |
| dmi_req_valid = 1'b0; |
| case (state_q) |
| Idle: |
| if ((dmi_access && update_dr) && (error_q == DMINoError)) begin |
| address_d = dmi[40-:7]; |
| data_d = dmi[33-:32]; |
| if (sv2v_cast_2(dmi[1-:2]) == dm_DTM_READ) |
| state_d = Read; |
| else if (sv2v_cast_2(dmi[1-:2]) == dm_DTM_WRITE) |
| state_d = Write; |
| end |
| Read: begin |
| dmi_req_valid = 1'b1; |
| if (dmi_req_ready) |
| state_d = WaitReadValid; |
| end |
| WaitReadValid: |
| if (dmi_resp_valid) begin |
| data_d = dmi_resp[33-:32]; |
| state_d = Idle; |
| end |
| Write: begin |
| dmi_req_valid = 1'b1; |
| if (dmi_req_ready) |
| state_d = Idle; |
| end |
| default: |
| if (dmi_resp_valid) |
| state_d = Idle; |
| endcase |
| if (update_dr && (state_q != Idle)) |
| error_dmi_busy = 1'b1; |
| if (capture_dr && |{state_q == Read, state_q == WaitReadValid}) |
| error_dmi_busy = 1'b1; |
| if (error_dmi_busy) |
| error_d = DMIBusy; |
| if (dmi_reset && dtmcs_select) |
| error_d = DMINoError; |
| end |
| assign dmi_tdo = dr_q[0]; |
| always @(*) begin : p_shift |
| dr_d = dr_q; |
| if (capture_dr) |
| if (dmi_access) |
| if ((error_q == DMINoError) && !error_dmi_busy) |
| dr_d = {address_q, data_q, DMINoError}; |
| else if ((error_q == DMIBusy) || error_dmi_busy) |
| dr_d = {address_q, data_q, DMIBusy}; |
| if (shift_dr) |
| if (dmi_access) |
| dr_d = {dmi_tdi, dr_q[40:1]}; |
| if (test_logic_reset) |
| dr_d = {41 {1'sb0}}; |
| end |
| always @(posedge tck_i or negedge trst_ni) begin : p_regs |
| if (!trst_ni) begin |
| dr_q <= {41 {1'sb0}}; |
| state_q <= Idle; |
| address_q <= {7 {1'sb0}}; |
| data_q <= {32 {1'sb0}}; |
| error_q <= DMINoError; |
| end |
| else begin |
| dr_q <= dr_d; |
| state_q <= state_d; |
| address_q <= address_d; |
| data_q <= data_d; |
| error_q <= error_d; |
| end |
| end |
| dmi_jtag_tap #( |
| .IrLength(5), |
| .IdcodeValue(IdcodeValue) |
| ) i_dmi_jtag_tap( |
| .tck_i(tck_i), |
| .tms_i(tms_i), |
| .trst_ni(trst_ni), |
| .td_i(td_i), |
| .td_o(td_o), |
| .tdo_oe_o(tdo_oe_o), |
| .testmode_i(testmode_i), |
| .test_logic_reset_o(test_logic_reset), |
| .shift_dr_o(shift_dr), |
| .update_dr_o(update_dr), |
| .capture_dr_o(capture_dr), |
| .dmi_access_o(dmi_access), |
| .dtmcs_select_o(dtmcs_select), |
| .dmi_reset_o(dmi_reset), |
| .dmi_error_i(error_q), |
| .dmi_tdi_o(dmi_tdi), |
| .dmi_tdo_i(dmi_tdo) |
| ); |
| dmi_cdc i_dmi_cdc( |
| .tck_i(tck_i), |
| .trst_ni(trst_ni), |
| .jtag_dmi_req_i(dmi_req), |
| .jtag_dmi_ready_o(dmi_req_ready), |
| .jtag_dmi_valid_i(dmi_req_valid), |
| .jtag_dmi_resp_o(dmi_resp), |
| .jtag_dmi_valid_o(dmi_resp_valid), |
| .jtag_dmi_ready_i(dmi_resp_ready), |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .core_dmi_req_o(dmi_req_o), |
| .core_dmi_valid_o(dmi_req_valid_o), |
| .core_dmi_ready_i(dmi_req_ready_i), |
| .core_dmi_resp_i(dmi_resp_i), |
| .core_dmi_ready_o(dmi_resp_ready_o), |
| .core_dmi_valid_i(dmi_resp_valid_i) |
| ); |
| endmodule |
| module dmi_jtag_tap ( |
| tck_i, |
| tms_i, |
| trst_ni, |
| td_i, |
| td_o, |
| tdo_oe_o, |
| testmode_i, |
| test_logic_reset_o, |
| shift_dr_o, |
| update_dr_o, |
| capture_dr_o, |
| dmi_access_o, |
| dtmcs_select_o, |
| dmi_reset_o, |
| dmi_error_i, |
| dmi_tdi_o, |
| dmi_tdo_i |
| ); |
| parameter [31:0] IrLength = 5; |
| parameter [31:0] IdcodeValue = 32'h00000001; |
| input wire tck_i; |
| input wire tms_i; |
| input wire trst_ni; |
| input wire td_i; |
| output reg td_o; |
| output reg tdo_oe_o; |
| input wire testmode_i; |
| output reg test_logic_reset_o; |
| output reg shift_dr_o; |
| output reg update_dr_o; |
| output reg capture_dr_o; |
| output reg dmi_access_o; |
| output reg dtmcs_select_o; |
| output wire dmi_reset_o; |
| input wire [1:0] dmi_error_i; |
| output wire dmi_tdi_o; |
| input wire dmi_tdo_i; |
| assign dmi_tdi_o = td_i; |
| reg [3:0] tap_state_q; |
| reg [3:0] tap_state_d; |
| reg [IrLength - 1:0] jtag_ir_shift_d; |
| reg [IrLength - 1:0] jtag_ir_shift_q; |
| reg [IrLength - 1:0] jtag_ir_d; |
| reg [IrLength - 1:0] jtag_ir_q; |
| reg capture_ir; |
| reg shift_ir; |
| reg update_ir; |
| function automatic [IrLength - 1:0] sv2v_cast_AFF3E; |
| input reg [IrLength - 1:0] inp; |
| sv2v_cast_AFF3E = inp; |
| endfunction |
| function automatic [IrLength - 1:0] sv2v_cast_42A93; |
| input reg [IrLength - 1:0] inp; |
| sv2v_cast_42A93 = inp; |
| endfunction |
| localparam [IrLength - 1:0] IDCODE = 'h1; |
| always @(*) begin : p_jtag |
| jtag_ir_shift_d = jtag_ir_shift_q; |
| jtag_ir_d = jtag_ir_q; |
| if (shift_ir) |
| jtag_ir_shift_d = {td_i, jtag_ir_shift_q[IrLength - 1:1]}; |
| if (capture_ir) |
| jtag_ir_shift_d = sv2v_cast_AFF3E(4'b0101); |
| if (update_ir) |
| jtag_ir_d = sv2v_cast_42A93(jtag_ir_shift_q); |
| if (test_logic_reset_o) begin |
| jtag_ir_shift_d = {IrLength {1'sb0}}; |
| jtag_ir_d = IDCODE; |
| end |
| end |
| always @(posedge tck_i or negedge trst_ni) begin : p_jtag_ir_reg |
| if (!trst_ni) begin |
| jtag_ir_shift_q <= {IrLength {1'sb0}}; |
| jtag_ir_q <= IDCODE; |
| end |
| else begin |
| jtag_ir_shift_q <= jtag_ir_shift_d; |
| jtag_ir_q <= jtag_ir_d; |
| end |
| end |
| reg [31:0] idcode_d; |
| reg [31:0] idcode_q; |
| reg idcode_select; |
| reg bypass_select; |
| reg [31:0] dtmcs_d; |
| reg [31:0] dtmcs_q; |
| reg bypass_d; |
| reg bypass_q; |
| assign dmi_reset_o = dtmcs_q[16]; |
| function automatic [1:0] sv2v_cast_2; |
| input reg [1:0] inp; |
| sv2v_cast_2 = inp; |
| endfunction |
| function automatic [30:0] sv2v_cast_31; |
| input reg [30:0] inp; |
| sv2v_cast_31 = inp; |
| endfunction |
| always @(*) begin |
| idcode_d = idcode_q; |
| bypass_d = bypass_q; |
| dtmcs_d = dtmcs_q; |
| if (capture_dr_o) begin |
| if (idcode_select) |
| idcode_d = IdcodeValue; |
| if (bypass_select) |
| bypass_d = 1'b0; |
| if (dtmcs_select_o) |
| dtmcs_d = {14'b00000000000000, 1'b0, 1'b0, 1'sb0, 3'd1, sv2v_cast_2(dmi_error_i), 6'd7, 4'd1}; |
| end |
| if (shift_dr_o) begin |
| if (idcode_select) |
| idcode_d = {td_i, sv2v_cast_31(idcode_q >> 1)}; |
| if (bypass_select) |
| bypass_d = td_i; |
| if (dtmcs_select_o) |
| dtmcs_d = {td_i, sv2v_cast_31(dtmcs_q >> 1)}; |
| end |
| if (test_logic_reset_o) begin |
| idcode_d = IdcodeValue; |
| bypass_d = 1'b0; |
| end |
| end |
| localparam [IrLength - 1:0] BYPASS0 = 'h0; |
| localparam [IrLength - 1:0] BYPASS1 = 'h1f; |
| localparam [IrLength - 1:0] DMIACCESS = 'h11; |
| localparam [IrLength - 1:0] DTMCSR = 'h10; |
| always @(*) begin : p_data_reg_sel |
| dmi_access_o = 1'b0; |
| dtmcs_select_o = 1'b0; |
| idcode_select = 1'b0; |
| bypass_select = 1'b0; |
| case (jtag_ir_q) |
| BYPASS0: bypass_select = 1'b1; |
| IDCODE: idcode_select = 1'b1; |
| DTMCSR: dtmcs_select_o = 1'b1; |
| DMIACCESS: dmi_access_o = 1'b1; |
| BYPASS1: bypass_select = 1'b1; |
| default: bypass_select = 1'b1; |
| endcase |
| end |
| reg tdo_mux; |
| always @(*) begin : p_out_sel |
| if (shift_ir) |
| tdo_mux = jtag_ir_shift_q[0]; |
| else |
| case (jtag_ir_q) |
| IDCODE: tdo_mux = idcode_q[0]; |
| DTMCSR: tdo_mux = dtmcs_q[0]; |
| DMIACCESS: tdo_mux = dmi_tdo_i; |
| default: tdo_mux = bypass_q; |
| endcase |
| end |
| wire tck_n; |
| prim_generic_clock_inv #(.HasScanMode(1'b1)) i_tck_inv( |
| .clk_i(tck_i), |
| .clk_no(tck_n), |
| .scanmode_i(testmode_i) |
| ); |
| always @(posedge tck_n or negedge trst_ni) begin : p_tdo_regs |
| if (!trst_ni) begin |
| td_o <= 1'b0; |
| tdo_oe_o <= 1'b0; |
| end |
| else begin |
| td_o <= tdo_mux; |
| tdo_oe_o <= shift_ir | shift_dr_o; |
| end |
| end |
| localparam [3:0] CaptureDr = 3; |
| localparam [3:0] CaptureIr = 10; |
| localparam [3:0] Exit1Dr = 5; |
| localparam [3:0] Exit1Ir = 12; |
| localparam [3:0] Exit2Dr = 7; |
| localparam [3:0] Exit2Ir = 14; |
| localparam [3:0] PauseDr = 6; |
| localparam [3:0] PauseIr = 13; |
| localparam [3:0] RunTestIdle = 1; |
| localparam [3:0] SelectDrScan = 2; |
| localparam [3:0] SelectIrScan = 9; |
| localparam [3:0] ShiftDr = 4; |
| localparam [3:0] ShiftIr = 11; |
| localparam [3:0] TestLogicReset = 0; |
| localparam [3:0] UpdateDr = 8; |
| localparam [3:0] UpdateIr = 15; |
| always @(*) begin : p_tap_fsm |
| test_logic_reset_o = 1'b0; |
| capture_dr_o = 1'b0; |
| shift_dr_o = 1'b0; |
| update_dr_o = 1'b0; |
| capture_ir = 1'b0; |
| shift_ir = 1'b0; |
| update_ir = 1'b0; |
| case (tap_state_q) |
| TestLogicReset: begin |
| tap_state_d = (tms_i ? TestLogicReset : RunTestIdle); |
| test_logic_reset_o = 1'b1; |
| end |
| RunTestIdle: tap_state_d = (tms_i ? SelectDrScan : RunTestIdle); |
| SelectDrScan: tap_state_d = (tms_i ? SelectIrScan : CaptureDr); |
| CaptureDr: begin |
| capture_dr_o = 1'b1; |
| tap_state_d = (tms_i ? Exit1Dr : ShiftDr); |
| end |
| ShiftDr: begin |
| shift_dr_o = 1'b1; |
| tap_state_d = (tms_i ? Exit1Dr : ShiftDr); |
| end |
| Exit1Dr: tap_state_d = (tms_i ? UpdateDr : PauseDr); |
| PauseDr: tap_state_d = (tms_i ? Exit2Dr : PauseDr); |
| Exit2Dr: tap_state_d = (tms_i ? UpdateDr : ShiftDr); |
| UpdateDr: begin |
| update_dr_o = 1'b1; |
| tap_state_d = (tms_i ? SelectDrScan : RunTestIdle); |
| end |
| SelectIrScan: tap_state_d = (tms_i ? TestLogicReset : CaptureIr); |
| CaptureIr: begin |
| capture_ir = 1'b1; |
| tap_state_d = (tms_i ? Exit1Ir : ShiftIr); |
| end |
| ShiftIr: begin |
| shift_ir = 1'b1; |
| tap_state_d = (tms_i ? Exit1Ir : ShiftIr); |
| end |
| Exit1Ir: tap_state_d = (tms_i ? UpdateIr : PauseIr); |
| PauseIr: tap_state_d = (tms_i ? Exit2Ir : PauseIr); |
| Exit2Ir: tap_state_d = (tms_i ? UpdateIr : ShiftIr); |
| UpdateIr: begin |
| update_ir = 1'b1; |
| tap_state_d = (tms_i ? SelectDrScan : RunTestIdle); |
| end |
| default: |
| ; |
| endcase |
| end |
| always @(posedge tck_i or negedge trst_ni) begin : p_regs |
| if (!trst_ni) begin |
| tap_state_q <= RunTestIdle; |
| idcode_q <= IdcodeValue; |
| bypass_q <= 1'b0; |
| dtmcs_q <= {32 {1'sb0}}; |
| end |
| else begin |
| tap_state_q <= tap_state_d; |
| idcode_q <= idcode_d; |
| bypass_q <= bypass_d; |
| dtmcs_q <= dtmcs_d; |
| end |
| end |
| endmodule |
| module rv_dm ( |
| clk_i, |
| rst_ni, |
| testmode_i, |
| ndmreset_o, |
| dmactive_o, |
| debug_req_o, |
| unavailable_i, |
| tl_d_i, |
| tl_d_o, |
| tl_h_o, |
| tl_h_i, |
| tck_i, |
| tms_i, |
| trst_ni, |
| td_i, |
| td_o, |
| tdo_oe_o |
| ); |
| parameter signed [31:0] NrHarts = 1; |
| parameter [31:0] IdcodeValue = 32'h00000001; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire testmode_i; |
| output wire ndmreset_o; |
| output wire dmactive_o; |
| output wire [NrHarts - 1:0] debug_req_o; |
| input wire [NrHarts - 1:0] unavailable_i; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_d_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_d_o; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_h_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_h_i; |
| input wire tck_i; |
| input wire tms_i; |
| input wire trst_ni; |
| input wire td_i; |
| output wire td_o; |
| output wire tdo_oe_o; |
| localparam signed [31:0] BusWidth = 32; |
| localparam [NrHarts - 1:0] SelectableHarts = {NrHarts {1'b1}}; |
| wire [(NrHarts * 32) - 1:0] hartinfo; |
| wire [NrHarts - 1:0] halted; |
| wire [NrHarts - 1:0] resumeack; |
| wire [NrHarts - 1:0] haltreq; |
| wire [NrHarts - 1:0] resumereq; |
| wire clear_resumeack; |
| wire cmd_valid; |
| wire [31:0] cmd; |
| wire cmderror_valid; |
| wire [2:0] cmderror; |
| wire cmdbusy; |
| localparam [4:0] dm_ProgBufSize = 5'h08; |
| wire [(dm_ProgBufSize * 32) - 1:0] progbuf; |
| localparam [3:0] dm_DataCount = 4'h2; |
| wire [(dm_DataCount * 32) - 1:0] data_csrs_mem; |
| wire [(dm_DataCount * 32) - 1:0] data_mem_csrs; |
| wire data_valid; |
| wire [19:0] hartsel; |
| wire [BusWidth - 1:0] sbaddress_csrs_sba; |
| wire [BusWidth - 1:0] sbaddress_sba_csrs; |
| wire sbaddress_write_valid; |
| wire sbreadonaddr; |
| wire sbautoincrement; |
| wire [2:0] sbaccess; |
| wire sbreadondata; |
| wire [BusWidth - 1:0] sbdata_write; |
| wire sbdata_read_valid; |
| wire sbdata_write_valid; |
| wire [BusWidth - 1:0] sbdata_read; |
| wire sbdata_valid; |
| wire sbbusy; |
| wire sberror_valid; |
| wire [2:0] sberror; |
| wire [40:0] dmi_req; |
| wire [33:0] dmi_rsp; |
| wire dmi_req_valid; |
| wire dmi_req_ready; |
| wire dmi_rsp_valid; |
| wire dmi_rsp_ready; |
| wire dmi_rst_n; |
| localparam [11:0] dm_DataAddr = 12'h380; |
| function automatic [3:0] sv2v_cast_4; |
| input reg [3:0] inp; |
| sv2v_cast_4 = inp; |
| endfunction |
| function automatic [11:0] sv2v_cast_12; |
| input reg [11:0] inp; |
| sv2v_cast_12 = inp; |
| endfunction |
| localparam [31:0] DebugHartInfo = {8'b00000000, 4'd2, 3'd0, 1'b1, sv2v_cast_4(dm_DataCount), sv2v_cast_12(dm_DataAddr)}; |
| generate |
| genvar i; |
| for (i = 0; i < NrHarts; i = i + 1) begin : gen_dm_hart_ctrl |
| assign hartinfo[i * 32+:32] = DebugHartInfo; |
| end |
| endgenerate |
| dm_csrs #( |
| .NrHarts(NrHarts), |
| .BusWidth(BusWidth), |
| .SelectableHarts(SelectableHarts) |
| ) i_dm_csrs( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .testmode_i(testmode_i), |
| .dmi_rst_ni(dmi_rst_n), |
| .dmi_req_valid_i(dmi_req_valid), |
| .dmi_req_ready_o(dmi_req_ready), |
| .dmi_req_i(dmi_req), |
| .dmi_resp_valid_o(dmi_rsp_valid), |
| .dmi_resp_ready_i(dmi_rsp_ready), |
| .dmi_resp_o(dmi_rsp), |
| .ndmreset_o(ndmreset_o), |
| .dmactive_o(dmactive_o), |
| .hartsel_o(hartsel), |
| .hartinfo_i(hartinfo), |
| .halted_i(halted), |
| .unavailable_i(unavailable_i), |
| .resumeack_i(resumeack), |
| .haltreq_o(haltreq), |
| .resumereq_o(resumereq), |
| .clear_resumeack_o(clear_resumeack), |
| .cmd_valid_o(cmd_valid), |
| .cmd_o(cmd), |
| .cmderror_valid_i(cmderror_valid), |
| .cmderror_i(cmderror), |
| .cmdbusy_i(cmdbusy), |
| .progbuf_o(progbuf), |
| .data_i(data_mem_csrs), |
| .data_valid_i(data_valid), |
| .data_o(data_csrs_mem), |
| .sbaddress_o(sbaddress_csrs_sba), |
| .sbaddress_i(sbaddress_sba_csrs), |
| .sbaddress_write_valid_o(sbaddress_write_valid), |
| .sbreadonaddr_o(sbreadonaddr), |
| .sbautoincrement_o(sbautoincrement), |
| .sbaccess_o(sbaccess), |
| .sbreadondata_o(sbreadondata), |
| .sbdata_o(sbdata_write), |
| .sbdata_read_valid_o(sbdata_read_valid), |
| .sbdata_write_valid_o(sbdata_write_valid), |
| .sbdata_i(sbdata_read), |
| .sbdata_valid_i(sbdata_valid), |
| .sbbusy_i(sbbusy), |
| .sberror_valid_i(sberror_valid), |
| .sberror_i(sberror) |
| ); |
| wire host_req; |
| wire [BusWidth - 1:0] host_add; |
| wire host_we; |
| wire [BusWidth - 1:0] host_wdata; |
| wire [(BusWidth / 8) - 1:0] host_be; |
| wire host_gnt; |
| wire host_r_valid; |
| wire [BusWidth - 1:0] host_r_rdata; |
| wire host_r_err; |
| dm_sba #(.BusWidth(BusWidth)) i_dm_sba( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .master_req_o(host_req), |
| .master_add_o(host_add), |
| .master_we_o(host_we), |
| .master_wdata_o(host_wdata), |
| .master_be_o(host_be), |
| .master_gnt_i(host_gnt), |
| .master_r_valid_i(host_r_valid), |
| .master_r_rdata_i(host_r_rdata), |
| .dmactive_i(dmactive_o), |
| .sbaddress_i(sbaddress_csrs_sba), |
| .sbaddress_o(sbaddress_sba_csrs), |
| .sbaddress_write_valid_i(sbaddress_write_valid), |
| .sbreadonaddr_i(sbreadonaddr), |
| .sbautoincrement_i(sbautoincrement), |
| .sbaccess_i(sbaccess), |
| .sbreadondata_i(sbreadondata), |
| .sbdata_i(sbdata_write), |
| .sbdata_read_valid_i(sbdata_read_valid), |
| .sbdata_write_valid_i(sbdata_write_valid), |
| .sbdata_o(sbdata_read), |
| .sbdata_valid_o(sbdata_valid), |
| .sbbusy_o(sbbusy), |
| .sberror_valid_o(sberror_valid), |
| .sberror_o(sberror) |
| ); |
| tlul_adapter_host #(.MAX_REQS(1)) tl_adapter_host_sba( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .req_i(host_req), |
| .gnt_o(host_gnt), |
| .addr_i(host_add), |
| .we_i(host_we), |
| .wdata_i(host_wdata), |
| .be_i(host_be), |
| .valid_o(host_r_valid), |
| .rdata_o(host_r_rdata), |
| .err_o(host_r_err), |
| .tl_o(tl_h_o), |
| .tl_i(tl_h_i) |
| ); |
| localparam [31:0] AddressWidthWords = BusWidth - 2; |
| wire req; |
| wire we; |
| wire [(BusWidth / 8) - 1:0] be; |
| wire [BusWidth - 1:0] wdata; |
| wire [BusWidth - 1:0] rdata; |
| reg rvalid; |
| wire [BusWidth - 1:0] addr_b; |
| wire [AddressWidthWords - 1:0] addr_w; |
| assign be = {BusWidth / 8 {1'b1}}; |
| assign addr_b = {addr_w, {2 {1'b0}}}; |
| dm_mem #( |
| .NrHarts(NrHarts), |
| .BusWidth(BusWidth), |
| .SelectableHarts(SelectableHarts), |
| .DmBaseAddress(1) |
| ) i_dm_mem( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .debug_req_o(debug_req_o), |
| .hartsel_i(hartsel), |
| .haltreq_i(haltreq), |
| .resumereq_i(resumereq), |
| .clear_resumeack_i(clear_resumeack), |
| .halted_o(halted), |
| .resuming_o(resumeack), |
| .cmd_valid_i(cmd_valid), |
| .cmd_i(cmd), |
| .cmderror_valid_o(cmderror_valid), |
| .cmderror_o(cmderror), |
| .cmdbusy_o(cmdbusy), |
| .progbuf_i(progbuf), |
| .data_i(data_csrs_mem), |
| .data_o(data_mem_csrs), |
| .data_valid_o(data_valid), |
| .req_i(req), |
| .we_i(we), |
| .addr_i(addr_b), |
| .wdata_i(wdata), |
| .be_i(be), |
| .rdata_o(rdata) |
| ); |
| dmi_jtag #(.IdcodeValue(IdcodeValue)) dap( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .testmode_i(testmode_i), |
| .dmi_rst_no(dmi_rst_n), |
| .dmi_req_o(dmi_req), |
| .dmi_req_valid_o(dmi_req_valid), |
| .dmi_req_ready_i(dmi_req_ready), |
| .dmi_resp_i(dmi_rsp), |
| .dmi_resp_ready_o(dmi_rsp_ready), |
| .dmi_resp_valid_i(dmi_rsp_valid), |
| .tck_i(tck_i), |
| .tms_i(tms_i), |
| .trst_ni(trst_ni), |
| .td_i(td_i), |
| .td_o(td_o), |
| .tdo_oe_o(tdo_oe_o) |
| ); |
| tlul_adapter_sram #( |
| .SramAw(AddressWidthWords), |
| .SramDw(BusWidth), |
| .Outstanding(1), |
| .ByteAccess(0) |
| ) tl_adapter_device_mem( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .req_o(req), |
| .gnt_i(1'b1), |
| .we_o(we), |
| .addr_o(addr_w), |
| .wdata_o(wdata), |
| .wmask_o(), |
| .rdata_i(rdata), |
| .rvalid_i(rvalid), |
| .rerror_i(2'b00), |
| .tl_o(tl_d_o), |
| .tl_i(tl_d_i) |
| ); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| rvalid <= 1'sb0; |
| else |
| rvalid <= req & ~we; |
| endmodule |
| module rv_plic ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| tl_o, |
| intr_src_i, |
| irq_o, |
| irq_id_o, |
| msip_o |
| ); |
| localparam signed [31:0] NumSrc = 41; |
| localparam signed [31:0] NumTarget = 1; |
| localparam [8:0] RV_PLIC_IP_OFFSET = 9'h000; |
| localparam [8:0] RV_PLIC_LE_OFFSET = 9'h004; |
| localparam [8:0] RV_PLIC_PRIO0_OFFSET = 9'h008; |
| localparam [8:0] RV_PLIC_PRIO1_OFFSET = 9'h00c; |
| localparam [8:0] RV_PLIC_PRIO2_OFFSET = 9'h010; |
| localparam [8:0] RV_PLIC_PRIO3_OFFSET = 9'h014; |
| localparam [8:0] RV_PLIC_PRIO4_OFFSET = 9'h018; |
| localparam [8:0] RV_PLIC_PRIO5_OFFSET = 9'h01c; |
| localparam [8:0] RV_PLIC_PRIO6_OFFSET = 9'h020; |
| localparam [8:0] RV_PLIC_PRIO7_OFFSET = 9'h024; |
| localparam [8:0] RV_PLIC_PRIO8_OFFSET = 9'h028; |
| localparam [8:0] RV_PLIC_PRIO9_OFFSET = 9'h02c; |
| localparam [8:0] RV_PLIC_PRIO10_OFFSET = 9'h030; |
| localparam [8:0] RV_PLIC_PRIO11_OFFSET = 9'h034; |
| localparam [8:0] RV_PLIC_PRIO12_OFFSET = 9'h038; |
| localparam [8:0] RV_PLIC_PRIO13_OFFSET = 9'h03c; |
| localparam [8:0] RV_PLIC_PRIO14_OFFSET = 9'h040; |
| localparam [8:0] RV_PLIC_PRIO15_OFFSET = 9'h044; |
| localparam [8:0] RV_PLIC_PRIO16_OFFSET = 9'h048; |
| localparam [8:0] RV_PLIC_PRIO17_OFFSET = 9'h04c; |
| localparam [8:0] RV_PLIC_PRIO18_OFFSET = 9'h050; |
| localparam [8:0] RV_PLIC_PRIO19_OFFSET = 9'h054; |
| localparam [8:0] RV_PLIC_PRIO20_OFFSET = 9'h058; |
| localparam [8:0] RV_PLIC_PRIO21_OFFSET = 9'h05c; |
| localparam [8:0] RV_PLIC_PRIO22_OFFSET = 9'h060; |
| localparam [8:0] RV_PLIC_PRIO23_OFFSET = 9'h064; |
| localparam [8:0] RV_PLIC_PRIO24_OFFSET = 9'h068; |
| localparam [8:0] RV_PLIC_PRIO25_OFFSET = 9'h06c; |
| localparam [8:0] RV_PLIC_PRIO26_OFFSET = 9'h070; |
| localparam [8:0] RV_PLIC_PRIO27_OFFSET = 9'h074; |
| localparam [8:0] RV_PLIC_PRIO28_OFFSET = 9'h078; |
| localparam [8:0] RV_PLIC_PRIO29_OFFSET = 9'h07c; |
| localparam [8:0] RV_PLIC_PRIO30_OFFSET = 9'h080; |
| localparam [8:0] RV_PLIC_PRIO31_OFFSET = 9'h084; |
| localparam [8:0] RV_PLIC_IE0_OFFSET = 9'h100; |
| localparam [8:0] RV_PLIC_THRESHOLD0_OFFSET = 9'h104; |
| localparam [8:0] RV_PLIC_CC0_OFFSET = 9'h108; |
| localparam [8:0] RV_PLIC_MSIP0_OFFSET = 9'h10c; |
| localparam signed [31:0] RV_PLIC_IP = 0; |
| localparam signed [31:0] RV_PLIC_LE = 1; |
| localparam signed [31:0] RV_PLIC_PRIO0 = 2; |
| localparam signed [31:0] RV_PLIC_PRIO1 = 3; |
| localparam signed [31:0] RV_PLIC_PRIO2 = 4; |
| localparam signed [31:0] RV_PLIC_PRIO3 = 5; |
| localparam signed [31:0] RV_PLIC_PRIO4 = 6; |
| localparam signed [31:0] RV_PLIC_PRIO5 = 7; |
| localparam signed [31:0] RV_PLIC_PRIO6 = 8; |
| localparam signed [31:0] RV_PLIC_PRIO7 = 9; |
| localparam signed [31:0] RV_PLIC_PRIO8 = 10; |
| localparam signed [31:0] RV_PLIC_PRIO9 = 11; |
| localparam signed [31:0] RV_PLIC_PRIO10 = 12; |
| localparam signed [31:0] RV_PLIC_PRIO11 = 13; |
| localparam signed [31:0] RV_PLIC_PRIO12 = 14; |
| localparam signed [31:0] RV_PLIC_PRIO13 = 15; |
| localparam signed [31:0] RV_PLIC_PRIO14 = 16; |
| localparam signed [31:0] RV_PLIC_PRIO15 = 17; |
| localparam signed [31:0] RV_PLIC_PRIO16 = 18; |
| localparam signed [31:0] RV_PLIC_PRIO17 = 19; |
| localparam signed [31:0] RV_PLIC_PRIO18 = 20; |
| localparam signed [31:0] RV_PLIC_PRIO19 = 21; |
| localparam signed [31:0] RV_PLIC_PRIO20 = 22; |
| localparam signed [31:0] RV_PLIC_PRIO21 = 23; |
| localparam signed [31:0] RV_PLIC_PRIO22 = 24; |
| localparam signed [31:0] RV_PLIC_PRIO23 = 25; |
| localparam signed [31:0] RV_PLIC_PRIO24 = 26; |
| localparam signed [31:0] RV_PLIC_PRIO25 = 27; |
| localparam signed [31:0] RV_PLIC_PRIO26 = 28; |
| localparam signed [31:0] RV_PLIC_PRIO27 = 29; |
| localparam signed [31:0] RV_PLIC_PRIO28 = 30; |
| localparam signed [31:0] RV_PLIC_PRIO29 = 31; |
| localparam signed [31:0] RV_PLIC_PRIO30 = 32; |
| localparam signed [31:0] RV_PLIC_PRIO31 = 33; |
| localparam signed [31:0] RV_PLIC_IE0 = 34; |
| localparam signed [31:0] RV_PLIC_THRESHOLD0 = 35; |
| localparam signed [31:0] RV_PLIC_CC0 = 36; |
| localparam signed [31:0] RV_PLIC_MSIP0 = 37; |
| localparam [151:0] RV_PLIC_PERMIT = {4'b1111, 4'b1111, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b1111, 4'b0001, 4'b0001, 4'b0001}; |
| localparam signed [31:0] SRCW = 6; |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_o; |
| input [NumSrc - 1:0] intr_src_i; |
| output [NumTarget - 1:0] irq_o; |
| output [((2 - NumTarget) * SRCW) + (((NumTarget - 1) * SRCW) - 1):(NumTarget - 1) * SRCW] irq_id_o; |
| output wire [NumTarget - 1:0] msip_o; |
| wire [171:0] reg2hw; |
| wire [69:0] hw2reg; |
| localparam signed [31:0] MAX_PRIO = 7; |
| localparam signed [31:0] PRIOW = 3; |
| wire [NumSrc - 1:0] le; |
| wire [NumSrc - 1:0] ip; |
| wire [NumSrc - 1:0] ie [0:NumTarget - 1]; |
| wire [NumTarget - 1:0] claim_re; |
| wire [SRCW - 1:0] claim_id [0:NumTarget - 1]; |
| reg [NumSrc - 1:0] claim; |
| wire [NumTarget - 1:0] complete_we; |
| wire [SRCW - 1:0] complete_id [0:NumTarget - 1]; |
| reg [NumSrc - 1:0] complete; |
| wire [((2 - NumTarget) * SRCW) + (((NumTarget - 1) * SRCW) - 1):(NumTarget - 1) * SRCW] cc_id; |
| wire [(NumSrc * PRIOW) - 1:0] prio; |
| wire [PRIOW - 1:0] threshold [0:NumTarget - 1]; |
| assign cc_id = irq_id_o; |
| always @(*) begin |
| claim = {NumSrc {1'sb0}}; |
| begin : sv2v_autoblock_79 |
| reg signed [31:0] i; |
| for (i = 0; i < NumTarget; i = i + 1) |
| if (claim_re[i]) |
| claim[claim_id[i]] = 1'b1; |
| end |
| end |
| always @(*) begin |
| complete = {NumSrc {1'sb0}}; |
| begin : sv2v_autoblock_80 |
| reg signed [31:0] i; |
| for (i = 0; i < NumTarget; i = i + 1) |
| if (complete_we[i]) |
| complete[complete_id[i]] = 1'b1; |
| end |
| end |
| assign prio[(NumSrc - 1) * PRIOW+:PRIOW] = reg2hw[139-:3]; |
| assign prio[(NumSrc - 2) * PRIOW+:PRIOW] = reg2hw[136-:3]; |
| assign prio[(NumSrc - 3) * PRIOW+:PRIOW] = reg2hw[133-:3]; |
| assign prio[(NumSrc - 4) * PRIOW+:PRIOW] = reg2hw[130-:3]; |
| assign prio[(NumSrc - 5) * PRIOW+:PRIOW] = reg2hw[127-:3]; |
| assign prio[(NumSrc - 6) * PRIOW+:PRIOW] = reg2hw[124-:3]; |
| assign prio[(NumSrc - 7) * PRIOW+:PRIOW] = reg2hw[121-:3]; |
| assign prio[(NumSrc - 8) * PRIOW+:PRIOW] = reg2hw[118-:3]; |
| assign prio[(NumSrc - 9) * PRIOW+:PRIOW] = reg2hw[115-:3]; |
| assign prio[(NumSrc - 10) * PRIOW+:PRIOW] = reg2hw[112-:3]; |
| assign prio[(NumSrc - 11) * PRIOW+:PRIOW] = reg2hw[109-:3]; |
| assign prio[(NumSrc - 12) * PRIOW+:PRIOW] = reg2hw[106-:3]; |
| assign prio[(NumSrc - 13) * PRIOW+:PRIOW] = reg2hw[103-:3]; |
| assign prio[(NumSrc - 14) * PRIOW+:PRIOW] = reg2hw[100-:3]; |
| assign prio[(NumSrc - 15) * PRIOW+:PRIOW] = reg2hw[97-:3]; |
| assign prio[(NumSrc - 16) * PRIOW+:PRIOW] = reg2hw[94-:3]; |
| assign prio[(NumSrc - 17) * PRIOW+:PRIOW] = reg2hw[91-:3]; |
| assign prio[(NumSrc - 18) * PRIOW+:PRIOW] = reg2hw[88-:3]; |
| assign prio[(NumSrc - 19) * PRIOW+:PRIOW] = reg2hw[85-:3]; |
| assign prio[(NumSrc - 20) * PRIOW+:PRIOW] = reg2hw[82-:3]; |
| assign prio[(NumSrc - 21) * PRIOW+:PRIOW] = reg2hw[79-:3]; |
| assign prio[(NumSrc - 22) * PRIOW+:PRIOW] = reg2hw[76-:3]; |
| assign prio[(NumSrc - 23) * PRIOW+:PRIOW] = reg2hw[73-:3]; |
| assign prio[(NumSrc - 24) * PRIOW+:PRIOW] = reg2hw[70-:3]; |
| assign prio[(NumSrc - 25) * PRIOW+:PRIOW] = reg2hw[67-:3]; |
| assign prio[(NumSrc - 26) * PRIOW+:PRIOW] = reg2hw[64-:3]; |
| assign prio[(NumSrc - 27) * PRIOW+:PRIOW] = reg2hw[61-:3]; |
| assign prio[(NumSrc - 28) * PRIOW+:PRIOW] = reg2hw[58-:3]; |
| assign prio[(NumSrc - 29) * PRIOW+:PRIOW] = reg2hw[55-:3]; |
| assign prio[(NumSrc - 30) * PRIOW+:PRIOW] = reg2hw[52-:3]; |
| assign prio[(NumSrc - 31) * PRIOW+:PRIOW] = reg2hw[49-:3]; |
| assign prio[(NumSrc - 32) * PRIOW+:PRIOW] = reg2hw[46-:3]; |
| generate |
| genvar s; |
| for (s = 0; s < 32; s = s + 1) begin : gen_ie0 |
| assign ie[0][s] = reg2hw[12 + s]; |
| end |
| endgenerate |
| assign threshold[0] = reg2hw[11-:3]; |
| assign claim_re[0] = reg2hw[1]; |
| assign claim_id[0] = irq_id_o[0+:SRCW]; |
| assign complete_we[0] = reg2hw[2]; |
| assign complete_id[0] = reg2hw[8-:6]; |
| assign hw2reg[5-:6] = cc_id[0+:SRCW]; |
| assign msip_o[0] = reg2hw[-0]; |
| generate |
| for (s = 0; s < 32; s = s + 1) begin : gen_ip |
| assign hw2reg[6 + (s * 2)] = 1'b1; |
| assign hw2reg[6 + ((s * 2) + 1)] = ip[s]; |
| end |
| endgenerate |
| generate |
| for (s = 0; s < 32; s = s + 1) begin : gen_le |
| assign le[s] = reg2hw[140 + s]; |
| end |
| endgenerate |
| rv_plic_gateway #(.N_SOURCE(NumSrc)) u_gateway( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .src_i(intr_src_i), |
| .le_i(le), |
| .claim_i(claim), |
| .complete_i(complete), |
| .ip_o(ip) |
| ); |
| generate |
| genvar i; |
| for (i = 0; i < NumTarget; i = i + 1) begin : gen_target |
| rv_plic_target #( |
| .N_SOURCE(NumSrc), |
| .MAX_PRIO(MAX_PRIO) |
| ) u_target( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .ip_i(ip), |
| .ie_i(ie[i]), |
| .prio_i(prio), |
| .threshold_i(threshold[i]), |
| .irq_o(irq_o[i]), |
| .irq_id_o(irq_id_o[i * SRCW+:SRCW]) |
| ); |
| end |
| endgenerate |
| rv_plic_reg_top u_reg( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(tl_i), |
| .tl_o(tl_o), |
| .reg2hw(reg2hw), |
| .hw2reg(hw2reg), |
| .devmode_i(1'b1) |
| ); |
| endmodule |
| module rv_plic_gateway ( |
| clk_i, |
| rst_ni, |
| src_i, |
| le_i, |
| claim_i, |
| complete_i, |
| ip_o |
| ); |
| parameter signed [31:0] N_SOURCE = 32; |
| input clk_i; |
| input rst_ni; |
| input [N_SOURCE - 1:0] src_i; |
| input [N_SOURCE - 1:0] le_i; |
| input [N_SOURCE - 1:0] claim_i; |
| input [N_SOURCE - 1:0] complete_i; |
| output reg [N_SOURCE - 1:0] ip_o; |
| reg [N_SOURCE - 1:0] ia; |
| reg [N_SOURCE - 1:0] set; |
| reg [N_SOURCE - 1:0] src_q; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| src_q <= {N_SOURCE {1'sb0}}; |
| else |
| src_q <= src_i; |
| always @(*) begin : sv2v_autoblock_81 |
| reg signed [31:0] i; |
| for (i = 0; i < N_SOURCE; i = i + 1) |
| set[i] = (le_i[i] ? src_i[i] & ~src_q[i] : src_i[i]); |
| end |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| ip_o <= {N_SOURCE {1'sb0}}; |
| else |
| ip_o <= (ip_o | ((set & ~ia) & ~ip_o)) & ~(ip_o & claim_i); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| ia <= {N_SOURCE {1'sb0}}; |
| else |
| ia <= (ia | (set & ~ia)) & ~((ia & complete_i) & ~ip_o); |
| endmodule |
| module rv_plic_reg_top ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| tl_o, |
| reg2hw, |
| hw2reg, |
| devmode_i |
| ); |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_o; |
| output wire [171:0] reg2hw; |
| input wire [69:0] hw2reg; |
| input devmode_i; |
| localparam signed [31:0] NumSrc = 41; |
| localparam signed [31:0] NumTarget = 1; |
| localparam [8:0] RV_PLIC_IP_OFFSET = 9'h000; |
| localparam [8:0] RV_PLIC_LE_OFFSET = 9'h004; |
| localparam [8:0] RV_PLIC_PRIO0_OFFSET = 9'h008; |
| localparam [8:0] RV_PLIC_PRIO1_OFFSET = 9'h00c; |
| localparam [8:0] RV_PLIC_PRIO2_OFFSET = 9'h010; |
| localparam [8:0] RV_PLIC_PRIO3_OFFSET = 9'h014; |
| localparam [8:0] RV_PLIC_PRIO4_OFFSET = 9'h018; |
| localparam [8:0] RV_PLIC_PRIO5_OFFSET = 9'h01c; |
| localparam [8:0] RV_PLIC_PRIO6_OFFSET = 9'h020; |
| localparam [8:0] RV_PLIC_PRIO7_OFFSET = 9'h024; |
| localparam [8:0] RV_PLIC_PRIO8_OFFSET = 9'h028; |
| localparam [8:0] RV_PLIC_PRIO9_OFFSET = 9'h02c; |
| localparam [8:0] RV_PLIC_PRIO10_OFFSET = 9'h030; |
| localparam [8:0] RV_PLIC_PRIO11_OFFSET = 9'h034; |
| localparam [8:0] RV_PLIC_PRIO12_OFFSET = 9'h038; |
| localparam [8:0] RV_PLIC_PRIO13_OFFSET = 9'h03c; |
| localparam [8:0] RV_PLIC_PRIO14_OFFSET = 9'h040; |
| localparam [8:0] RV_PLIC_PRIO15_OFFSET = 9'h044; |
| localparam [8:0] RV_PLIC_PRIO16_OFFSET = 9'h048; |
| localparam [8:0] RV_PLIC_PRIO17_OFFSET = 9'h04c; |
| localparam [8:0] RV_PLIC_PRIO18_OFFSET = 9'h050; |
| localparam [8:0] RV_PLIC_PRIO19_OFFSET = 9'h054; |
| localparam [8:0] RV_PLIC_PRIO20_OFFSET = 9'h058; |
| localparam [8:0] RV_PLIC_PRIO21_OFFSET = 9'h05c; |
| localparam [8:0] RV_PLIC_PRIO22_OFFSET = 9'h060; |
| localparam [8:0] RV_PLIC_PRIO23_OFFSET = 9'h064; |
| localparam [8:0] RV_PLIC_PRIO24_OFFSET = 9'h068; |
| localparam [8:0] RV_PLIC_PRIO25_OFFSET = 9'h06c; |
| localparam [8:0] RV_PLIC_PRIO26_OFFSET = 9'h070; |
| localparam [8:0] RV_PLIC_PRIO27_OFFSET = 9'h074; |
| localparam [8:0] RV_PLIC_PRIO28_OFFSET = 9'h078; |
| localparam [8:0] RV_PLIC_PRIO29_OFFSET = 9'h07c; |
| localparam [8:0] RV_PLIC_PRIO30_OFFSET = 9'h080; |
| localparam [8:0] RV_PLIC_PRIO31_OFFSET = 9'h084; |
| localparam [8:0] RV_PLIC_IE0_OFFSET = 9'h100; |
| localparam [8:0] RV_PLIC_THRESHOLD0_OFFSET = 9'h104; |
| localparam [8:0] RV_PLIC_CC0_OFFSET = 9'h108; |
| localparam [8:0] RV_PLIC_MSIP0_OFFSET = 9'h10c; |
| localparam signed [31:0] RV_PLIC_IP = 0; |
| localparam signed [31:0] RV_PLIC_LE = 1; |
| localparam signed [31:0] RV_PLIC_PRIO0 = 2; |
| localparam signed [31:0] RV_PLIC_PRIO1 = 3; |
| localparam signed [31:0] RV_PLIC_PRIO2 = 4; |
| localparam signed [31:0] RV_PLIC_PRIO3 = 5; |
| localparam signed [31:0] RV_PLIC_PRIO4 = 6; |
| localparam signed [31:0] RV_PLIC_PRIO5 = 7; |
| localparam signed [31:0] RV_PLIC_PRIO6 = 8; |
| localparam signed [31:0] RV_PLIC_PRIO7 = 9; |
| localparam signed [31:0] RV_PLIC_PRIO8 = 10; |
| localparam signed [31:0] RV_PLIC_PRIO9 = 11; |
| localparam signed [31:0] RV_PLIC_PRIO10 = 12; |
| localparam signed [31:0] RV_PLIC_PRIO11 = 13; |
| localparam signed [31:0] RV_PLIC_PRIO12 = 14; |
| localparam signed [31:0] RV_PLIC_PRIO13 = 15; |
| localparam signed [31:0] RV_PLIC_PRIO14 = 16; |
| localparam signed [31:0] RV_PLIC_PRIO15 = 17; |
| localparam signed [31:0] RV_PLIC_PRIO16 = 18; |
| localparam signed [31:0] RV_PLIC_PRIO17 = 19; |
| localparam signed [31:0] RV_PLIC_PRIO18 = 20; |
| localparam signed [31:0] RV_PLIC_PRIO19 = 21; |
| localparam signed [31:0] RV_PLIC_PRIO20 = 22; |
| localparam signed [31:0] RV_PLIC_PRIO21 = 23; |
| localparam signed [31:0] RV_PLIC_PRIO22 = 24; |
| localparam signed [31:0] RV_PLIC_PRIO23 = 25; |
| localparam signed [31:0] RV_PLIC_PRIO24 = 26; |
| localparam signed [31:0] RV_PLIC_PRIO25 = 27; |
| localparam signed [31:0] RV_PLIC_PRIO26 = 28; |
| localparam signed [31:0] RV_PLIC_PRIO27 = 29; |
| localparam signed [31:0] RV_PLIC_PRIO28 = 30; |
| localparam signed [31:0] RV_PLIC_PRIO29 = 31; |
| localparam signed [31:0] RV_PLIC_PRIO30 = 32; |
| localparam signed [31:0] RV_PLIC_PRIO31 = 33; |
| localparam signed [31:0] RV_PLIC_IE0 = 34; |
| localparam signed [31:0] RV_PLIC_THRESHOLD0 = 35; |
| localparam signed [31:0] RV_PLIC_CC0 = 36; |
| localparam signed [31:0] RV_PLIC_MSIP0 = 37; |
| localparam [151:0] RV_PLIC_PERMIT = {4'b1111, 4'b1111, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b1111, 4'b0001, 4'b0001, 4'b0001}; |
| localparam signed [31:0] AW = 9; |
| localparam signed [31:0] DW = 32; |
| localparam signed [31:0] DBW = DW / 8; |
| wire reg_we; |
| wire reg_re; |
| wire [AW - 1:0] reg_addr; |
| wire [DW - 1:0] reg_wdata; |
| wire [DBW - 1:0] reg_be; |
| wire [DW - 1:0] reg_rdata; |
| wire reg_error; |
| wire addrmiss; |
| reg wr_err; |
| reg [DW - 1:0] reg_rdata_next; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_reg_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_reg_d2h; |
| assign tl_reg_h2d = tl_i; |
| assign tl_o = tl_reg_d2h; |
| tlul_adapter_reg #( |
| .RegAw(AW), |
| .RegDw(DW) |
| ) u_reg_if( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(tl_reg_h2d), |
| .tl_o(tl_reg_d2h), |
| .we_o(reg_we), |
| .re_o(reg_re), |
| .addr_o(reg_addr), |
| .wdata_o(reg_wdata), |
| .be_o(reg_be), |
| .rdata_i(reg_rdata), |
| .error_i(reg_error) |
| ); |
| assign reg_rdata = reg_rdata_next; |
| assign reg_error = (devmode_i & addrmiss) | wr_err; |
| wire ip_p_0_qs; |
| wire ip_p_1_qs; |
| wire ip_p_2_qs; |
| wire ip_p_3_qs; |
| wire ip_p_4_qs; |
| wire ip_p_5_qs; |
| wire ip_p_6_qs; |
| wire ip_p_7_qs; |
| wire ip_p_8_qs; |
| wire ip_p_9_qs; |
| wire ip_p_10_qs; |
| wire ip_p_11_qs; |
| wire ip_p_12_qs; |
| wire ip_p_13_qs; |
| wire ip_p_14_qs; |
| wire ip_p_15_qs; |
| wire ip_p_16_qs; |
| wire ip_p_17_qs; |
| wire ip_p_18_qs; |
| wire ip_p_19_qs; |
| wire ip_p_20_qs; |
| wire ip_p_21_qs; |
| wire ip_p_22_qs; |
| wire ip_p_23_qs; |
| wire ip_p_24_qs; |
| wire ip_p_25_qs; |
| wire ip_p_26_qs; |
| wire ip_p_27_qs; |
| wire ip_p_28_qs; |
| wire ip_p_29_qs; |
| wire ip_p_30_qs; |
| wire ip_p_31_qs; |
| wire le_le_0_qs; |
| wire le_le_0_wd; |
| wire le_le_0_we; |
| wire le_le_1_qs; |
| wire le_le_1_wd; |
| wire le_le_1_we; |
| wire le_le_2_qs; |
| wire le_le_2_wd; |
| wire le_le_2_we; |
| wire le_le_3_qs; |
| wire le_le_3_wd; |
| wire le_le_3_we; |
| wire le_le_4_qs; |
| wire le_le_4_wd; |
| wire le_le_4_we; |
| wire le_le_5_qs; |
| wire le_le_5_wd; |
| wire le_le_5_we; |
| wire le_le_6_qs; |
| wire le_le_6_wd; |
| wire le_le_6_we; |
| wire le_le_7_qs; |
| wire le_le_7_wd; |
| wire le_le_7_we; |
| wire le_le_8_qs; |
| wire le_le_8_wd; |
| wire le_le_8_we; |
| wire le_le_9_qs; |
| wire le_le_9_wd; |
| wire le_le_9_we; |
| wire le_le_10_qs; |
| wire le_le_10_wd; |
| wire le_le_10_we; |
| wire le_le_11_qs; |
| wire le_le_11_wd; |
| wire le_le_11_we; |
| wire le_le_12_qs; |
| wire le_le_12_wd; |
| wire le_le_12_we; |
| wire le_le_13_qs; |
| wire le_le_13_wd; |
| wire le_le_13_we; |
| wire le_le_14_qs; |
| wire le_le_14_wd; |
| wire le_le_14_we; |
| wire le_le_15_qs; |
| wire le_le_15_wd; |
| wire le_le_15_we; |
| wire le_le_16_qs; |
| wire le_le_16_wd; |
| wire le_le_16_we; |
| wire le_le_17_qs; |
| wire le_le_17_wd; |
| wire le_le_17_we; |
| wire le_le_18_qs; |
| wire le_le_18_wd; |
| wire le_le_18_we; |
| wire le_le_19_qs; |
| wire le_le_19_wd; |
| wire le_le_19_we; |
| wire le_le_20_qs; |
| wire le_le_20_wd; |
| wire le_le_20_we; |
| wire le_le_21_qs; |
| wire le_le_21_wd; |
| wire le_le_21_we; |
| wire le_le_22_qs; |
| wire le_le_22_wd; |
| wire le_le_22_we; |
| wire le_le_23_qs; |
| wire le_le_23_wd; |
| wire le_le_23_we; |
| wire le_le_24_qs; |
| wire le_le_24_wd; |
| wire le_le_24_we; |
| wire le_le_25_qs; |
| wire le_le_25_wd; |
| wire le_le_25_we; |
| wire le_le_26_qs; |
| wire le_le_26_wd; |
| wire le_le_26_we; |
| wire le_le_27_qs; |
| wire le_le_27_wd; |
| wire le_le_27_we; |
| wire le_le_28_qs; |
| wire le_le_28_wd; |
| wire le_le_28_we; |
| wire le_le_29_qs; |
| wire le_le_29_wd; |
| wire le_le_29_we; |
| wire le_le_30_qs; |
| wire le_le_30_wd; |
| wire le_le_30_we; |
| wire le_le_31_qs; |
| wire le_le_31_wd; |
| wire le_le_31_we; |
| wire [2:0] prio0_qs; |
| wire [2:0] prio0_wd; |
| wire prio0_we; |
| wire [2:0] prio1_qs; |
| wire [2:0] prio1_wd; |
| wire prio1_we; |
| wire [2:0] prio2_qs; |
| wire [2:0] prio2_wd; |
| wire prio2_we; |
| wire [2:0] prio3_qs; |
| wire [2:0] prio3_wd; |
| wire prio3_we; |
| wire [2:0] prio4_qs; |
| wire [2:0] prio4_wd; |
| wire prio4_we; |
| wire [2:0] prio5_qs; |
| wire [2:0] prio5_wd; |
| wire prio5_we; |
| wire [2:0] prio6_qs; |
| wire [2:0] prio6_wd; |
| wire prio6_we; |
| wire [2:0] prio7_qs; |
| wire [2:0] prio7_wd; |
| wire prio7_we; |
| wire [2:0] prio8_qs; |
| wire [2:0] prio8_wd; |
| wire prio8_we; |
| wire [2:0] prio9_qs; |
| wire [2:0] prio9_wd; |
| wire prio9_we; |
| wire [2:0] prio10_qs; |
| wire [2:0] prio10_wd; |
| wire prio10_we; |
| wire [2:0] prio11_qs; |
| wire [2:0] prio11_wd; |
| wire prio11_we; |
| wire [2:0] prio12_qs; |
| wire [2:0] prio12_wd; |
| wire prio12_we; |
| wire [2:0] prio13_qs; |
| wire [2:0] prio13_wd; |
| wire prio13_we; |
| wire [2:0] prio14_qs; |
| wire [2:0] prio14_wd; |
| wire prio14_we; |
| wire [2:0] prio15_qs; |
| wire [2:0] prio15_wd; |
| wire prio15_we; |
| wire [2:0] prio16_qs; |
| wire [2:0] prio16_wd; |
| wire prio16_we; |
| wire [2:0] prio17_qs; |
| wire [2:0] prio17_wd; |
| wire prio17_we; |
| wire [2:0] prio18_qs; |
| wire [2:0] prio18_wd; |
| wire prio18_we; |
| wire [2:0] prio19_qs; |
| wire [2:0] prio19_wd; |
| wire prio19_we; |
| wire [2:0] prio20_qs; |
| wire [2:0] prio20_wd; |
| wire prio20_we; |
| wire [2:0] prio21_qs; |
| wire [2:0] prio21_wd; |
| wire prio21_we; |
| wire [2:0] prio22_qs; |
| wire [2:0] prio22_wd; |
| wire prio22_we; |
| wire [2:0] prio23_qs; |
| wire [2:0] prio23_wd; |
| wire prio23_we; |
| wire [2:0] prio24_qs; |
| wire [2:0] prio24_wd; |
| wire prio24_we; |
| wire [2:0] prio25_qs; |
| wire [2:0] prio25_wd; |
| wire prio25_we; |
| wire [2:0] prio26_qs; |
| wire [2:0] prio26_wd; |
| wire prio26_we; |
| wire [2:0] prio27_qs; |
| wire [2:0] prio27_wd; |
| wire prio27_we; |
| wire [2:0] prio28_qs; |
| wire [2:0] prio28_wd; |
| wire prio28_we; |
| wire [2:0] prio29_qs; |
| wire [2:0] prio29_wd; |
| wire prio29_we; |
| wire [2:0] prio30_qs; |
| wire [2:0] prio30_wd; |
| wire prio30_we; |
| wire [2:0] prio31_qs; |
| wire [2:0] prio31_wd; |
| wire prio31_we; |
| wire ie0_e_0_qs; |
| wire ie0_e_0_wd; |
| wire ie0_e_0_we; |
| wire ie0_e_1_qs; |
| wire ie0_e_1_wd; |
| wire ie0_e_1_we; |
| wire ie0_e_2_qs; |
| wire ie0_e_2_wd; |
| wire ie0_e_2_we; |
| wire ie0_e_3_qs; |
| wire ie0_e_3_wd; |
| wire ie0_e_3_we; |
| wire ie0_e_4_qs; |
| wire ie0_e_4_wd; |
| wire ie0_e_4_we; |
| wire ie0_e_5_qs; |
| wire ie0_e_5_wd; |
| wire ie0_e_5_we; |
| wire ie0_e_6_qs; |
| wire ie0_e_6_wd; |
| wire ie0_e_6_we; |
| wire ie0_e_7_qs; |
| wire ie0_e_7_wd; |
| wire ie0_e_7_we; |
| wire ie0_e_8_qs; |
| wire ie0_e_8_wd; |
| wire ie0_e_8_we; |
| wire ie0_e_9_qs; |
| wire ie0_e_9_wd; |
| wire ie0_e_9_we; |
| wire ie0_e_10_qs; |
| wire ie0_e_10_wd; |
| wire ie0_e_10_we; |
| wire ie0_e_11_qs; |
| wire ie0_e_11_wd; |
| wire ie0_e_11_we; |
| wire ie0_e_12_qs; |
| wire ie0_e_12_wd; |
| wire ie0_e_12_we; |
| wire ie0_e_13_qs; |
| wire ie0_e_13_wd; |
| wire ie0_e_13_we; |
| wire ie0_e_14_qs; |
| wire ie0_e_14_wd; |
| wire ie0_e_14_we; |
| wire ie0_e_15_qs; |
| wire ie0_e_15_wd; |
| wire ie0_e_15_we; |
| wire ie0_e_16_qs; |
| wire ie0_e_16_wd; |
| wire ie0_e_16_we; |
| wire ie0_e_17_qs; |
| wire ie0_e_17_wd; |
| wire ie0_e_17_we; |
| wire ie0_e_18_qs; |
| wire ie0_e_18_wd; |
| wire ie0_e_18_we; |
| wire ie0_e_19_qs; |
| wire ie0_e_19_wd; |
| wire ie0_e_19_we; |
| wire ie0_e_20_qs; |
| wire ie0_e_20_wd; |
| wire ie0_e_20_we; |
| wire ie0_e_21_qs; |
| wire ie0_e_21_wd; |
| wire ie0_e_21_we; |
| wire ie0_e_22_qs; |
| wire ie0_e_22_wd; |
| wire ie0_e_22_we; |
| wire ie0_e_23_qs; |
| wire ie0_e_23_wd; |
| wire ie0_e_23_we; |
| wire ie0_e_24_qs; |
| wire ie0_e_24_wd; |
| wire ie0_e_24_we; |
| wire ie0_e_25_qs; |
| wire ie0_e_25_wd; |
| wire ie0_e_25_we; |
| wire ie0_e_26_qs; |
| wire ie0_e_26_wd; |
| wire ie0_e_26_we; |
| wire ie0_e_27_qs; |
| wire ie0_e_27_wd; |
| wire ie0_e_27_we; |
| wire ie0_e_28_qs; |
| wire ie0_e_28_wd; |
| wire ie0_e_28_we; |
| wire ie0_e_29_qs; |
| wire ie0_e_29_wd; |
| wire ie0_e_29_we; |
| wire ie0_e_30_qs; |
| wire ie0_e_30_wd; |
| wire ie0_e_30_we; |
| wire ie0_e_31_qs; |
| wire ie0_e_31_wd; |
| wire ie0_e_31_we; |
| wire [2:0] threshold0_qs; |
| wire [2:0] threshold0_wd; |
| wire threshold0_we; |
| wire [5:0] cc0_qs; |
| wire [5:0] cc0_wd; |
| wire cc0_we; |
| wire cc0_re; |
| wire msip0_qs; |
| wire msip0_wd; |
| wire msip0_we; |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[6]), |
| .d(hw2reg[7]), |
| .qe(), |
| .q(), |
| .qs(ip_p_0_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_1( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[8]), |
| .d(hw2reg[9]), |
| .qe(), |
| .q(), |
| .qs(ip_p_1_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_2( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[10]), |
| .d(hw2reg[11]), |
| .qe(), |
| .q(), |
| .qs(ip_p_2_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_3( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[12]), |
| .d(hw2reg[13]), |
| .qe(), |
| .q(), |
| .qs(ip_p_3_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_4( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[14]), |
| .d(hw2reg[15]), |
| .qe(), |
| .q(), |
| .qs(ip_p_4_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_5( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[16]), |
| .d(hw2reg[17]), |
| .qe(), |
| .q(), |
| .qs(ip_p_5_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_6( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[18]), |
| .d(hw2reg[19]), |
| .qe(), |
| .q(), |
| .qs(ip_p_6_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_7( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[20]), |
| .d(hw2reg[21]), |
| .qe(), |
| .q(), |
| .qs(ip_p_7_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_8( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[22]), |
| .d(hw2reg[23]), |
| .qe(), |
| .q(), |
| .qs(ip_p_8_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_9( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[24]), |
| .d(hw2reg[25]), |
| .qe(), |
| .q(), |
| .qs(ip_p_9_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_10( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[26]), |
| .d(hw2reg[27]), |
| .qe(), |
| .q(), |
| .qs(ip_p_10_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_11( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[28]), |
| .d(hw2reg[29]), |
| .qe(), |
| .q(), |
| .qs(ip_p_11_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_12( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[30]), |
| .d(hw2reg[31]), |
| .qe(), |
| .q(), |
| .qs(ip_p_12_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_13( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[32]), |
| .d(hw2reg[33]), |
| .qe(), |
| .q(), |
| .qs(ip_p_13_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_14( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[34]), |
| .d(hw2reg[35]), |
| .qe(), |
| .q(), |
| .qs(ip_p_14_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_15( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[36]), |
| .d(hw2reg[37]), |
| .qe(), |
| .q(), |
| .qs(ip_p_15_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_16( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[38]), |
| .d(hw2reg[39]), |
| .qe(), |
| .q(), |
| .qs(ip_p_16_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_17( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[40]), |
| .d(hw2reg[41]), |
| .qe(), |
| .q(), |
| .qs(ip_p_17_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_18( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[42]), |
| .d(hw2reg[43]), |
| .qe(), |
| .q(), |
| .qs(ip_p_18_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_19( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[44]), |
| .d(hw2reg[45]), |
| .qe(), |
| .q(), |
| .qs(ip_p_19_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_20( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[46]), |
| .d(hw2reg[47]), |
| .qe(), |
| .q(), |
| .qs(ip_p_20_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_21( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[48]), |
| .d(hw2reg[49]), |
| .qe(), |
| .q(), |
| .qs(ip_p_21_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_22( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[50]), |
| .d(hw2reg[51]), |
| .qe(), |
| .q(), |
| .qs(ip_p_22_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_23( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[52]), |
| .d(hw2reg[53]), |
| .qe(), |
| .q(), |
| .qs(ip_p_23_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_24( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[54]), |
| .d(hw2reg[55]), |
| .qe(), |
| .q(), |
| .qs(ip_p_24_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_25( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[56]), |
| .d(hw2reg[57]), |
| .qe(), |
| .q(), |
| .qs(ip_p_25_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_26( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[58]), |
| .d(hw2reg[59]), |
| .qe(), |
| .q(), |
| .qs(ip_p_26_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_27( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[60]), |
| .d(hw2reg[61]), |
| .qe(), |
| .q(), |
| .qs(ip_p_27_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_28( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[62]), |
| .d(hw2reg[63]), |
| .qe(), |
| .q(), |
| .qs(ip_p_28_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_29( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[64]), |
| .d(hw2reg[65]), |
| .qe(), |
| .q(), |
| .qs(ip_p_29_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_30( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[66]), |
| .d(hw2reg[67]), |
| .qe(), |
| .q(), |
| .qs(ip_p_30_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RO"), |
| .RESVAL(1'h0) |
| ) u_ip_p_31( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(1'b0), |
| .wd(1'sb0), |
| .de(hw2reg[68]), |
| .d(hw2reg[69]), |
| .qe(), |
| .q(), |
| .qs(ip_p_31_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_0_we), |
| .wd(le_le_0_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[140]), |
| .qs(le_le_0_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_1( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_1_we), |
| .wd(le_le_1_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[141]), |
| .qs(le_le_1_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_2( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_2_we), |
| .wd(le_le_2_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[142]), |
| .qs(le_le_2_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_3( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_3_we), |
| .wd(le_le_3_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[143]), |
| .qs(le_le_3_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_4( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_4_we), |
| .wd(le_le_4_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[144]), |
| .qs(le_le_4_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_5( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_5_we), |
| .wd(le_le_5_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[145]), |
| .qs(le_le_5_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_6( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_6_we), |
| .wd(le_le_6_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[146]), |
| .qs(le_le_6_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_7( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_7_we), |
| .wd(le_le_7_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[147]), |
| .qs(le_le_7_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_8( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_8_we), |
| .wd(le_le_8_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[148]), |
| .qs(le_le_8_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_9( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_9_we), |
| .wd(le_le_9_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[149]), |
| .qs(le_le_9_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_10( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_10_we), |
| .wd(le_le_10_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[150]), |
| .qs(le_le_10_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_11( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_11_we), |
| .wd(le_le_11_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[151]), |
| .qs(le_le_11_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_12( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_12_we), |
| .wd(le_le_12_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[152]), |
| .qs(le_le_12_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_13( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_13_we), |
| .wd(le_le_13_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[153]), |
| .qs(le_le_13_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_14( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_14_we), |
| .wd(le_le_14_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[154]), |
| .qs(le_le_14_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_15( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_15_we), |
| .wd(le_le_15_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[155]), |
| .qs(le_le_15_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_16( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_16_we), |
| .wd(le_le_16_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[156]), |
| .qs(le_le_16_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_17( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_17_we), |
| .wd(le_le_17_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[157]), |
| .qs(le_le_17_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_18( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_18_we), |
| .wd(le_le_18_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[158]), |
| .qs(le_le_18_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_19( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_19_we), |
| .wd(le_le_19_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[159]), |
| .qs(le_le_19_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_20( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_20_we), |
| .wd(le_le_20_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[160]), |
| .qs(le_le_20_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_21( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_21_we), |
| .wd(le_le_21_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[161]), |
| .qs(le_le_21_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_22( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_22_we), |
| .wd(le_le_22_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[162]), |
| .qs(le_le_22_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_23( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_23_we), |
| .wd(le_le_23_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[163]), |
| .qs(le_le_23_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_24( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_24_we), |
| .wd(le_le_24_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[164]), |
| .qs(le_le_24_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_25( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_25_we), |
| .wd(le_le_25_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[165]), |
| .qs(le_le_25_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_26( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_26_we), |
| .wd(le_le_26_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[166]), |
| .qs(le_le_26_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_27( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_27_we), |
| .wd(le_le_27_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[167]), |
| .qs(le_le_27_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_28( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_28_we), |
| .wd(le_le_28_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[168]), |
| .qs(le_le_28_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_29( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_29_we), |
| .wd(le_le_29_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[169]), |
| .qs(le_le_29_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_30( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_30_we), |
| .wd(le_le_30_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[170]), |
| .qs(le_le_30_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_le_le_31( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(le_le_31_we), |
| .wd(le_le_31_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[171]), |
| .qs(le_le_31_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio0_we), |
| .wd(prio0_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[139-:3]), |
| .qs(prio0_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio1( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio1_we), |
| .wd(prio1_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[136-:3]), |
| .qs(prio1_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio2( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio2_we), |
| .wd(prio2_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[133-:3]), |
| .qs(prio2_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio3( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio3_we), |
| .wd(prio3_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[130-:3]), |
| .qs(prio3_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio4( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio4_we), |
| .wd(prio4_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[127-:3]), |
| .qs(prio4_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio5( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio5_we), |
| .wd(prio5_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[124-:3]), |
| .qs(prio5_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio6( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio6_we), |
| .wd(prio6_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[121-:3]), |
| .qs(prio6_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio7( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio7_we), |
| .wd(prio7_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[118-:3]), |
| .qs(prio7_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio8( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio8_we), |
| .wd(prio8_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[115-:3]), |
| .qs(prio8_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio9( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio9_we), |
| .wd(prio9_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[112-:3]), |
| .qs(prio9_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio10( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio10_we), |
| .wd(prio10_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[109-:3]), |
| .qs(prio10_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio11( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio11_we), |
| .wd(prio11_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[106-:3]), |
| .qs(prio11_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio12( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio12_we), |
| .wd(prio12_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[103-:3]), |
| .qs(prio12_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio13( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio13_we), |
| .wd(prio13_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[100-:3]), |
| .qs(prio13_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio14( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio14_we), |
| .wd(prio14_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[97-:3]), |
| .qs(prio14_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio15( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio15_we), |
| .wd(prio15_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[94-:3]), |
| .qs(prio15_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio16( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio16_we), |
| .wd(prio16_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[91-:3]), |
| .qs(prio16_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio17( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio17_we), |
| .wd(prio17_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[88-:3]), |
| .qs(prio17_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio18( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio18_we), |
| .wd(prio18_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[85-:3]), |
| .qs(prio18_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio19( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio19_we), |
| .wd(prio19_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[82-:3]), |
| .qs(prio19_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio20( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio20_we), |
| .wd(prio20_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[79-:3]), |
| .qs(prio20_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio21( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio21_we), |
| .wd(prio21_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[76-:3]), |
| .qs(prio21_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio22( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio22_we), |
| .wd(prio22_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[73-:3]), |
| .qs(prio22_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio23( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio23_we), |
| .wd(prio23_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[70-:3]), |
| .qs(prio23_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio24( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio24_we), |
| .wd(prio24_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[67-:3]), |
| .qs(prio24_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio25( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio25_we), |
| .wd(prio25_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[64-:3]), |
| .qs(prio25_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio26( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio26_we), |
| .wd(prio26_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[61-:3]), |
| .qs(prio26_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio27( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio27_we), |
| .wd(prio27_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[58-:3]), |
| .qs(prio27_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio28( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio28_we), |
| .wd(prio28_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[55-:3]), |
| .qs(prio28_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio29( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio29_we), |
| .wd(prio29_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[52-:3]), |
| .qs(prio29_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio30( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio30_we), |
| .wd(prio30_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[49-:3]), |
| .qs(prio30_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_prio31( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(prio31_we), |
| .wd(prio31_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[46-:3]), |
| .qs(prio31_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_0_we), |
| .wd(ie0_e_0_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[12]), |
| .qs(ie0_e_0_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_1( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_1_we), |
| .wd(ie0_e_1_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[13]), |
| .qs(ie0_e_1_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_2( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_2_we), |
| .wd(ie0_e_2_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[14]), |
| .qs(ie0_e_2_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_3( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_3_we), |
| .wd(ie0_e_3_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[15]), |
| .qs(ie0_e_3_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_4( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_4_we), |
| .wd(ie0_e_4_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[16]), |
| .qs(ie0_e_4_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_5( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_5_we), |
| .wd(ie0_e_5_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[17]), |
| .qs(ie0_e_5_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_6( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_6_we), |
| .wd(ie0_e_6_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[18]), |
| .qs(ie0_e_6_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_7( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_7_we), |
| .wd(ie0_e_7_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[19]), |
| .qs(ie0_e_7_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_8( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_8_we), |
| .wd(ie0_e_8_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[20]), |
| .qs(ie0_e_8_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_9( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_9_we), |
| .wd(ie0_e_9_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[21]), |
| .qs(ie0_e_9_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_10( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_10_we), |
| .wd(ie0_e_10_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[22]), |
| .qs(ie0_e_10_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_11( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_11_we), |
| .wd(ie0_e_11_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[23]), |
| .qs(ie0_e_11_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_12( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_12_we), |
| .wd(ie0_e_12_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[24]), |
| .qs(ie0_e_12_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_13( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_13_we), |
| .wd(ie0_e_13_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[25]), |
| .qs(ie0_e_13_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_14( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_14_we), |
| .wd(ie0_e_14_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[26]), |
| .qs(ie0_e_14_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_15( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_15_we), |
| .wd(ie0_e_15_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[27]), |
| .qs(ie0_e_15_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_16( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_16_we), |
| .wd(ie0_e_16_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[28]), |
| .qs(ie0_e_16_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_17( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_17_we), |
| .wd(ie0_e_17_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[29]), |
| .qs(ie0_e_17_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_18( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_18_we), |
| .wd(ie0_e_18_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[30]), |
| .qs(ie0_e_18_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_19( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_19_we), |
| .wd(ie0_e_19_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[31]), |
| .qs(ie0_e_19_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_20( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_20_we), |
| .wd(ie0_e_20_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[32]), |
| .qs(ie0_e_20_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_21( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_21_we), |
| .wd(ie0_e_21_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[33]), |
| .qs(ie0_e_21_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_22( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_22_we), |
| .wd(ie0_e_22_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[34]), |
| .qs(ie0_e_22_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_23( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_23_we), |
| .wd(ie0_e_23_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[35]), |
| .qs(ie0_e_23_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_24( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_24_we), |
| .wd(ie0_e_24_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[36]), |
| .qs(ie0_e_24_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_25( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_25_we), |
| .wd(ie0_e_25_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[37]), |
| .qs(ie0_e_25_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_26( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_26_we), |
| .wd(ie0_e_26_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[38]), |
| .qs(ie0_e_26_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_27( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_27_we), |
| .wd(ie0_e_27_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[39]), |
| .qs(ie0_e_27_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_28( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_28_we), |
| .wd(ie0_e_28_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[40]), |
| .qs(ie0_e_28_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_29( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_29_we), |
| .wd(ie0_e_29_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[41]), |
| .qs(ie0_e_29_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_30( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_30_we), |
| .wd(ie0_e_30_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[42]), |
| .qs(ie0_e_30_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ie0_e_31( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ie0_e_31_we), |
| .wd(ie0_e_31_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[43]), |
| .qs(ie0_e_31_qs) |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_threshold0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(threshold0_we), |
| .wd(threshold0_wd), |
| .de(1'b0), |
| .d({3 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[11-:3]), |
| .qs(threshold0_qs) |
| ); |
| prim_subreg_ext #(.DW(6)) u_cc0( |
| .re(cc0_re), |
| .we(cc0_we), |
| .wd(cc0_wd), |
| .d(hw2reg[5-:6]), |
| .qre(reg2hw[1]), |
| .qe(reg2hw[2]), |
| .q(reg2hw[8-:6]), |
| .qs(cc0_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_msip0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(msip0_we), |
| .wd(msip0_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[-0]), |
| .qs(msip0_qs) |
| ); |
| reg [37:0] addr_hit; |
| always @(*) begin |
| addr_hit = {38 {1'sb0}}; |
| addr_hit[0] = reg_addr == RV_PLIC_IP_OFFSET; |
| addr_hit[1] = reg_addr == RV_PLIC_LE_OFFSET; |
| addr_hit[2] = reg_addr == RV_PLIC_PRIO0_OFFSET; |
| addr_hit[3] = reg_addr == RV_PLIC_PRIO1_OFFSET; |
| addr_hit[4] = reg_addr == RV_PLIC_PRIO2_OFFSET; |
| addr_hit[5] = reg_addr == RV_PLIC_PRIO3_OFFSET; |
| addr_hit[6] = reg_addr == RV_PLIC_PRIO4_OFFSET; |
| addr_hit[7] = reg_addr == RV_PLIC_PRIO5_OFFSET; |
| addr_hit[8] = reg_addr == RV_PLIC_PRIO6_OFFSET; |
| addr_hit[9] = reg_addr == RV_PLIC_PRIO7_OFFSET; |
| addr_hit[10] = reg_addr == RV_PLIC_PRIO8_OFFSET; |
| addr_hit[11] = reg_addr == RV_PLIC_PRIO9_OFFSET; |
| addr_hit[12] = reg_addr == RV_PLIC_PRIO10_OFFSET; |
| addr_hit[13] = reg_addr == RV_PLIC_PRIO11_OFFSET; |
| addr_hit[14] = reg_addr == RV_PLIC_PRIO12_OFFSET; |
| addr_hit[15] = reg_addr == RV_PLIC_PRIO13_OFFSET; |
| addr_hit[16] = reg_addr == RV_PLIC_PRIO14_OFFSET; |
| addr_hit[17] = reg_addr == RV_PLIC_PRIO15_OFFSET; |
| addr_hit[18] = reg_addr == RV_PLIC_PRIO16_OFFSET; |
| addr_hit[19] = reg_addr == RV_PLIC_PRIO17_OFFSET; |
| addr_hit[20] = reg_addr == RV_PLIC_PRIO18_OFFSET; |
| addr_hit[21] = reg_addr == RV_PLIC_PRIO19_OFFSET; |
| addr_hit[22] = reg_addr == RV_PLIC_PRIO20_OFFSET; |
| addr_hit[23] = reg_addr == RV_PLIC_PRIO21_OFFSET; |
| addr_hit[24] = reg_addr == RV_PLIC_PRIO22_OFFSET; |
| addr_hit[25] = reg_addr == RV_PLIC_PRIO23_OFFSET; |
| addr_hit[26] = reg_addr == RV_PLIC_PRIO24_OFFSET; |
| addr_hit[27] = reg_addr == RV_PLIC_PRIO25_OFFSET; |
| addr_hit[28] = reg_addr == RV_PLIC_PRIO26_OFFSET; |
| addr_hit[29] = reg_addr == RV_PLIC_PRIO27_OFFSET; |
| addr_hit[30] = reg_addr == RV_PLIC_PRIO28_OFFSET; |
| addr_hit[31] = reg_addr == RV_PLIC_PRIO29_OFFSET; |
| addr_hit[32] = reg_addr == RV_PLIC_PRIO30_OFFSET; |
| addr_hit[33] = reg_addr == RV_PLIC_PRIO31_OFFSET; |
| addr_hit[34] = reg_addr == RV_PLIC_IE0_OFFSET; |
| addr_hit[35] = reg_addr == RV_PLIC_THRESHOLD0_OFFSET; |
| addr_hit[36] = reg_addr == RV_PLIC_CC0_OFFSET; |
| addr_hit[37] = reg_addr == RV_PLIC_MSIP0_OFFSET; |
| end |
| assign addrmiss = (reg_re || reg_we ? ~|addr_hit : 1'b0); |
| always @(*) begin |
| wr_err = 1'b0; |
| if ((addr_hit[0] && reg_we) && (RV_PLIC_PERMIT[148+:4] != (RV_PLIC_PERMIT[148+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[1] && reg_we) && (RV_PLIC_PERMIT[144+:4] != (RV_PLIC_PERMIT[144+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[2] && reg_we) && (RV_PLIC_PERMIT[140+:4] != (RV_PLIC_PERMIT[140+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[3] && reg_we) && (RV_PLIC_PERMIT[136+:4] != (RV_PLIC_PERMIT[136+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[4] && reg_we) && (RV_PLIC_PERMIT[132+:4] != (RV_PLIC_PERMIT[132+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[5] && reg_we) && (RV_PLIC_PERMIT[128+:4] != (RV_PLIC_PERMIT[128+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[6] && reg_we) && (RV_PLIC_PERMIT[124+:4] != (RV_PLIC_PERMIT[124+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[7] && reg_we) && (RV_PLIC_PERMIT[120+:4] != (RV_PLIC_PERMIT[120+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[8] && reg_we) && (RV_PLIC_PERMIT[116+:4] != (RV_PLIC_PERMIT[116+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[9] && reg_we) && (RV_PLIC_PERMIT[112+:4] != (RV_PLIC_PERMIT[112+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[10] && reg_we) && (RV_PLIC_PERMIT[108+:4] != (RV_PLIC_PERMIT[108+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[11] && reg_we) && (RV_PLIC_PERMIT[104+:4] != (RV_PLIC_PERMIT[104+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[12] && reg_we) && (RV_PLIC_PERMIT[100+:4] != (RV_PLIC_PERMIT[100+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[13] && reg_we) && (RV_PLIC_PERMIT[96+:4] != (RV_PLIC_PERMIT[96+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[14] && reg_we) && (RV_PLIC_PERMIT[92+:4] != (RV_PLIC_PERMIT[92+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[15] && reg_we) && (RV_PLIC_PERMIT[88+:4] != (RV_PLIC_PERMIT[88+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[16] && reg_we) && (RV_PLIC_PERMIT[84+:4] != (RV_PLIC_PERMIT[84+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[17] && reg_we) && (RV_PLIC_PERMIT[80+:4] != (RV_PLIC_PERMIT[80+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[18] && reg_we) && (RV_PLIC_PERMIT[76+:4] != (RV_PLIC_PERMIT[76+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[19] && reg_we) && (RV_PLIC_PERMIT[72+:4] != (RV_PLIC_PERMIT[72+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[20] && reg_we) && (RV_PLIC_PERMIT[68+:4] != (RV_PLIC_PERMIT[68+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[21] && reg_we) && (RV_PLIC_PERMIT[64+:4] != (RV_PLIC_PERMIT[64+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[22] && reg_we) && (RV_PLIC_PERMIT[60+:4] != (RV_PLIC_PERMIT[60+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[23] && reg_we) && (RV_PLIC_PERMIT[56+:4] != (RV_PLIC_PERMIT[56+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[24] && reg_we) && (RV_PLIC_PERMIT[52+:4] != (RV_PLIC_PERMIT[52+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[25] && reg_we) && (RV_PLIC_PERMIT[48+:4] != (RV_PLIC_PERMIT[48+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[26] && reg_we) && (RV_PLIC_PERMIT[44+:4] != (RV_PLIC_PERMIT[44+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[27] && reg_we) && (RV_PLIC_PERMIT[40+:4] != (RV_PLIC_PERMIT[40+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[28] && reg_we) && (RV_PLIC_PERMIT[36+:4] != (RV_PLIC_PERMIT[36+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[29] && reg_we) && (RV_PLIC_PERMIT[32+:4] != (RV_PLIC_PERMIT[32+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[30] && reg_we) && (RV_PLIC_PERMIT[28+:4] != (RV_PLIC_PERMIT[28+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[31] && reg_we) && (RV_PLIC_PERMIT[24+:4] != (RV_PLIC_PERMIT[24+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[32] && reg_we) && (RV_PLIC_PERMIT[20+:4] != (RV_PLIC_PERMIT[20+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[33] && reg_we) && (RV_PLIC_PERMIT[16+:4] != (RV_PLIC_PERMIT[16+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[34] && reg_we) && (RV_PLIC_PERMIT[12+:4] != (RV_PLIC_PERMIT[12+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[35] && reg_we) && (RV_PLIC_PERMIT[8+:4] != (RV_PLIC_PERMIT[8+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[36] && reg_we) && (RV_PLIC_PERMIT[4+:4] != (RV_PLIC_PERMIT[4+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[37] && reg_we) && (RV_PLIC_PERMIT[0+:4] != (RV_PLIC_PERMIT[0+:4] & reg_be))) |
| wr_err = 1'b1; |
| end |
| assign le_le_0_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_0_wd = reg_wdata[0]; |
| assign le_le_1_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_1_wd = reg_wdata[1]; |
| assign le_le_2_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_2_wd = reg_wdata[2]; |
| assign le_le_3_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_3_wd = reg_wdata[3]; |
| assign le_le_4_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_4_wd = reg_wdata[4]; |
| assign le_le_5_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_5_wd = reg_wdata[5]; |
| assign le_le_6_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_6_wd = reg_wdata[6]; |
| assign le_le_7_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_7_wd = reg_wdata[7]; |
| assign le_le_8_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_8_wd = reg_wdata[8]; |
| assign le_le_9_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_9_wd = reg_wdata[9]; |
| assign le_le_10_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_10_wd = reg_wdata[10]; |
| assign le_le_11_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_11_wd = reg_wdata[11]; |
| assign le_le_12_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_12_wd = reg_wdata[12]; |
| assign le_le_13_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_13_wd = reg_wdata[13]; |
| assign le_le_14_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_14_wd = reg_wdata[14]; |
| assign le_le_15_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_15_wd = reg_wdata[15]; |
| assign le_le_16_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_16_wd = reg_wdata[16]; |
| assign le_le_17_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_17_wd = reg_wdata[17]; |
| assign le_le_18_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_18_wd = reg_wdata[18]; |
| assign le_le_19_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_19_wd = reg_wdata[19]; |
| assign le_le_20_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_20_wd = reg_wdata[20]; |
| assign le_le_21_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_21_wd = reg_wdata[21]; |
| assign le_le_22_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_22_wd = reg_wdata[22]; |
| assign le_le_23_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_23_wd = reg_wdata[23]; |
| assign le_le_24_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_24_wd = reg_wdata[24]; |
| assign le_le_25_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_25_wd = reg_wdata[25]; |
| assign le_le_26_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_26_wd = reg_wdata[26]; |
| assign le_le_27_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_27_wd = reg_wdata[27]; |
| assign le_le_28_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_28_wd = reg_wdata[28]; |
| assign le_le_29_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_29_wd = reg_wdata[29]; |
| assign le_le_30_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_30_wd = reg_wdata[30]; |
| assign le_le_31_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign le_le_31_wd = reg_wdata[31]; |
| assign prio0_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign prio0_wd = reg_wdata[2:0]; |
| assign prio1_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign prio1_wd = reg_wdata[2:0]; |
| assign prio2_we = (addr_hit[4] & reg_we) & ~wr_err; |
| assign prio2_wd = reg_wdata[2:0]; |
| assign prio3_we = (addr_hit[5] & reg_we) & ~wr_err; |
| assign prio3_wd = reg_wdata[2:0]; |
| assign prio4_we = (addr_hit[6] & reg_we) & ~wr_err; |
| assign prio4_wd = reg_wdata[2:0]; |
| assign prio5_we = (addr_hit[7] & reg_we) & ~wr_err; |
| assign prio5_wd = reg_wdata[2:0]; |
| assign prio6_we = (addr_hit[8] & reg_we) & ~wr_err; |
| assign prio6_wd = reg_wdata[2:0]; |
| assign prio7_we = (addr_hit[9] & reg_we) & ~wr_err; |
| assign prio7_wd = reg_wdata[2:0]; |
| assign prio8_we = (addr_hit[10] & reg_we) & ~wr_err; |
| assign prio8_wd = reg_wdata[2:0]; |
| assign prio9_we = (addr_hit[11] & reg_we) & ~wr_err; |
| assign prio9_wd = reg_wdata[2:0]; |
| assign prio10_we = (addr_hit[12] & reg_we) & ~wr_err; |
| assign prio10_wd = reg_wdata[2:0]; |
| assign prio11_we = (addr_hit[13] & reg_we) & ~wr_err; |
| assign prio11_wd = reg_wdata[2:0]; |
| assign prio12_we = (addr_hit[14] & reg_we) & ~wr_err; |
| assign prio12_wd = reg_wdata[2:0]; |
| assign prio13_we = (addr_hit[15] & reg_we) & ~wr_err; |
| assign prio13_wd = reg_wdata[2:0]; |
| assign prio14_we = (addr_hit[16] & reg_we) & ~wr_err; |
| assign prio14_wd = reg_wdata[2:0]; |
| assign prio15_we = (addr_hit[17] & reg_we) & ~wr_err; |
| assign prio15_wd = reg_wdata[2:0]; |
| assign prio16_we = (addr_hit[18] & reg_we) & ~wr_err; |
| assign prio16_wd = reg_wdata[2:0]; |
| assign prio17_we = (addr_hit[19] & reg_we) & ~wr_err; |
| assign prio17_wd = reg_wdata[2:0]; |
| assign prio18_we = (addr_hit[20] & reg_we) & ~wr_err; |
| assign prio18_wd = reg_wdata[2:0]; |
| assign prio19_we = (addr_hit[21] & reg_we) & ~wr_err; |
| assign prio19_wd = reg_wdata[2:0]; |
| assign prio20_we = (addr_hit[22] & reg_we) & ~wr_err; |
| assign prio20_wd = reg_wdata[2:0]; |
| assign prio21_we = (addr_hit[23] & reg_we) & ~wr_err; |
| assign prio21_wd = reg_wdata[2:0]; |
| assign prio22_we = (addr_hit[24] & reg_we) & ~wr_err; |
| assign prio22_wd = reg_wdata[2:0]; |
| assign prio23_we = (addr_hit[25] & reg_we) & ~wr_err; |
| assign prio23_wd = reg_wdata[2:0]; |
| assign prio24_we = (addr_hit[26] & reg_we) & ~wr_err; |
| assign prio24_wd = reg_wdata[2:0]; |
| assign prio25_we = (addr_hit[27] & reg_we) & ~wr_err; |
| assign prio25_wd = reg_wdata[2:0]; |
| assign prio26_we = (addr_hit[28] & reg_we) & ~wr_err; |
| assign prio26_wd = reg_wdata[2:0]; |
| assign prio27_we = (addr_hit[29] & reg_we) & ~wr_err; |
| assign prio27_wd = reg_wdata[2:0]; |
| assign prio28_we = (addr_hit[30] & reg_we) & ~wr_err; |
| assign prio28_wd = reg_wdata[2:0]; |
| assign prio29_we = (addr_hit[31] & reg_we) & ~wr_err; |
| assign prio29_wd = reg_wdata[2:0]; |
| assign prio30_we = (addr_hit[32] & reg_we) & ~wr_err; |
| assign prio30_wd = reg_wdata[2:0]; |
| assign prio31_we = (addr_hit[33] & reg_we) & ~wr_err; |
| assign prio31_wd = reg_wdata[2:0]; |
| assign ie0_e_0_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_0_wd = reg_wdata[0]; |
| assign ie0_e_1_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_1_wd = reg_wdata[1]; |
| assign ie0_e_2_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_2_wd = reg_wdata[2]; |
| assign ie0_e_3_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_3_wd = reg_wdata[3]; |
| assign ie0_e_4_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_4_wd = reg_wdata[4]; |
| assign ie0_e_5_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_5_wd = reg_wdata[5]; |
| assign ie0_e_6_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_6_wd = reg_wdata[6]; |
| assign ie0_e_7_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_7_wd = reg_wdata[7]; |
| assign ie0_e_8_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_8_wd = reg_wdata[8]; |
| assign ie0_e_9_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_9_wd = reg_wdata[9]; |
| assign ie0_e_10_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_10_wd = reg_wdata[10]; |
| assign ie0_e_11_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_11_wd = reg_wdata[11]; |
| assign ie0_e_12_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_12_wd = reg_wdata[12]; |
| assign ie0_e_13_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_13_wd = reg_wdata[13]; |
| assign ie0_e_14_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_14_wd = reg_wdata[14]; |
| assign ie0_e_15_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_15_wd = reg_wdata[15]; |
| assign ie0_e_16_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_16_wd = reg_wdata[16]; |
| assign ie0_e_17_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_17_wd = reg_wdata[17]; |
| assign ie0_e_18_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_18_wd = reg_wdata[18]; |
| assign ie0_e_19_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_19_wd = reg_wdata[19]; |
| assign ie0_e_20_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_20_wd = reg_wdata[20]; |
| assign ie0_e_21_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_21_wd = reg_wdata[21]; |
| assign ie0_e_22_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_22_wd = reg_wdata[22]; |
| assign ie0_e_23_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_23_wd = reg_wdata[23]; |
| assign ie0_e_24_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_24_wd = reg_wdata[24]; |
| assign ie0_e_25_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_25_wd = reg_wdata[25]; |
| assign ie0_e_26_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_26_wd = reg_wdata[26]; |
| assign ie0_e_27_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_27_wd = reg_wdata[27]; |
| assign ie0_e_28_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_28_wd = reg_wdata[28]; |
| assign ie0_e_29_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_29_wd = reg_wdata[29]; |
| assign ie0_e_30_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_30_wd = reg_wdata[30]; |
| assign ie0_e_31_we = (addr_hit[34] & reg_we) & ~wr_err; |
| assign ie0_e_31_wd = reg_wdata[31]; |
| assign threshold0_we = (addr_hit[35] & reg_we) & ~wr_err; |
| assign threshold0_wd = reg_wdata[2:0]; |
| assign cc0_we = (addr_hit[36] & reg_we) & ~wr_err; |
| assign cc0_wd = reg_wdata[5:0]; |
| assign cc0_re = addr_hit[36] && reg_re; |
| assign msip0_we = (addr_hit[37] & reg_we) & ~wr_err; |
| assign msip0_wd = reg_wdata[0]; |
| always @(*) begin |
| reg_rdata_next = {DW {1'sb0}}; |
| case (1'b1) |
| addr_hit[0]: begin |
| reg_rdata_next[0] = ip_p_0_qs; |
| reg_rdata_next[1] = ip_p_1_qs; |
| reg_rdata_next[2] = ip_p_2_qs; |
| reg_rdata_next[3] = ip_p_3_qs; |
| reg_rdata_next[4] = ip_p_4_qs; |
| reg_rdata_next[5] = ip_p_5_qs; |
| reg_rdata_next[6] = ip_p_6_qs; |
| reg_rdata_next[7] = ip_p_7_qs; |
| reg_rdata_next[8] = ip_p_8_qs; |
| reg_rdata_next[9] = ip_p_9_qs; |
| reg_rdata_next[10] = ip_p_10_qs; |
| reg_rdata_next[11] = ip_p_11_qs; |
| reg_rdata_next[12] = ip_p_12_qs; |
| reg_rdata_next[13] = ip_p_13_qs; |
| reg_rdata_next[14] = ip_p_14_qs; |
| reg_rdata_next[15] = ip_p_15_qs; |
| reg_rdata_next[16] = ip_p_16_qs; |
| reg_rdata_next[17] = ip_p_17_qs; |
| reg_rdata_next[18] = ip_p_18_qs; |
| reg_rdata_next[19] = ip_p_19_qs; |
| reg_rdata_next[20] = ip_p_20_qs; |
| reg_rdata_next[21] = ip_p_21_qs; |
| reg_rdata_next[22] = ip_p_22_qs; |
| reg_rdata_next[23] = ip_p_23_qs; |
| reg_rdata_next[24] = ip_p_24_qs; |
| reg_rdata_next[25] = ip_p_25_qs; |
| reg_rdata_next[26] = ip_p_26_qs; |
| reg_rdata_next[27] = ip_p_27_qs; |
| reg_rdata_next[28] = ip_p_28_qs; |
| reg_rdata_next[29] = ip_p_29_qs; |
| reg_rdata_next[30] = ip_p_30_qs; |
| reg_rdata_next[31] = ip_p_31_qs; |
| end |
| addr_hit[1]: begin |
| reg_rdata_next[0] = le_le_0_qs; |
| reg_rdata_next[1] = le_le_1_qs; |
| reg_rdata_next[2] = le_le_2_qs; |
| reg_rdata_next[3] = le_le_3_qs; |
| reg_rdata_next[4] = le_le_4_qs; |
| reg_rdata_next[5] = le_le_5_qs; |
| reg_rdata_next[6] = le_le_6_qs; |
| reg_rdata_next[7] = le_le_7_qs; |
| reg_rdata_next[8] = le_le_8_qs; |
| reg_rdata_next[9] = le_le_9_qs; |
| reg_rdata_next[10] = le_le_10_qs; |
| reg_rdata_next[11] = le_le_11_qs; |
| reg_rdata_next[12] = le_le_12_qs; |
| reg_rdata_next[13] = le_le_13_qs; |
| reg_rdata_next[14] = le_le_14_qs; |
| reg_rdata_next[15] = le_le_15_qs; |
| reg_rdata_next[16] = le_le_16_qs; |
| reg_rdata_next[17] = le_le_17_qs; |
| reg_rdata_next[18] = le_le_18_qs; |
| reg_rdata_next[19] = le_le_19_qs; |
| reg_rdata_next[20] = le_le_20_qs; |
| reg_rdata_next[21] = le_le_21_qs; |
| reg_rdata_next[22] = le_le_22_qs; |
| reg_rdata_next[23] = le_le_23_qs; |
| reg_rdata_next[24] = le_le_24_qs; |
| reg_rdata_next[25] = le_le_25_qs; |
| reg_rdata_next[26] = le_le_26_qs; |
| reg_rdata_next[27] = le_le_27_qs; |
| reg_rdata_next[28] = le_le_28_qs; |
| reg_rdata_next[29] = le_le_29_qs; |
| reg_rdata_next[30] = le_le_30_qs; |
| reg_rdata_next[31] = le_le_31_qs; |
| end |
| addr_hit[2]: reg_rdata_next[2:0] = prio0_qs; |
| addr_hit[3]: reg_rdata_next[2:0] = prio1_qs; |
| addr_hit[4]: reg_rdata_next[2:0] = prio2_qs; |
| addr_hit[5]: reg_rdata_next[2:0] = prio3_qs; |
| addr_hit[6]: reg_rdata_next[2:0] = prio4_qs; |
| addr_hit[7]: reg_rdata_next[2:0] = prio5_qs; |
| addr_hit[8]: reg_rdata_next[2:0] = prio6_qs; |
| addr_hit[9]: reg_rdata_next[2:0] = prio7_qs; |
| addr_hit[10]: reg_rdata_next[2:0] = prio8_qs; |
| addr_hit[11]: reg_rdata_next[2:0] = prio9_qs; |
| addr_hit[12]: reg_rdata_next[2:0] = prio10_qs; |
| addr_hit[13]: reg_rdata_next[2:0] = prio11_qs; |
| addr_hit[14]: reg_rdata_next[2:0] = prio12_qs; |
| addr_hit[15]: reg_rdata_next[2:0] = prio13_qs; |
| addr_hit[16]: reg_rdata_next[2:0] = prio14_qs; |
| addr_hit[17]: reg_rdata_next[2:0] = prio15_qs; |
| addr_hit[18]: reg_rdata_next[2:0] = prio16_qs; |
| addr_hit[19]: reg_rdata_next[2:0] = prio17_qs; |
| addr_hit[20]: reg_rdata_next[2:0] = prio18_qs; |
| addr_hit[21]: reg_rdata_next[2:0] = prio19_qs; |
| addr_hit[22]: reg_rdata_next[2:0] = prio20_qs; |
| addr_hit[23]: reg_rdata_next[2:0] = prio21_qs; |
| addr_hit[24]: reg_rdata_next[2:0] = prio22_qs; |
| addr_hit[25]: reg_rdata_next[2:0] = prio23_qs; |
| addr_hit[26]: reg_rdata_next[2:0] = prio24_qs; |
| addr_hit[27]: reg_rdata_next[2:0] = prio25_qs; |
| addr_hit[28]: reg_rdata_next[2:0] = prio26_qs; |
| addr_hit[29]: reg_rdata_next[2:0] = prio27_qs; |
| addr_hit[30]: reg_rdata_next[2:0] = prio28_qs; |
| addr_hit[31]: reg_rdata_next[2:0] = prio29_qs; |
| addr_hit[32]: reg_rdata_next[2:0] = prio30_qs; |
| addr_hit[33]: reg_rdata_next[2:0] = prio31_qs; |
| addr_hit[34]: begin |
| reg_rdata_next[0] = ie0_e_0_qs; |
| reg_rdata_next[1] = ie0_e_1_qs; |
| reg_rdata_next[2] = ie0_e_2_qs; |
| reg_rdata_next[3] = ie0_e_3_qs; |
| reg_rdata_next[4] = ie0_e_4_qs; |
| reg_rdata_next[5] = ie0_e_5_qs; |
| reg_rdata_next[6] = ie0_e_6_qs; |
| reg_rdata_next[7] = ie0_e_7_qs; |
| reg_rdata_next[8] = ie0_e_8_qs; |
| reg_rdata_next[9] = ie0_e_9_qs; |
| reg_rdata_next[10] = ie0_e_10_qs; |
| reg_rdata_next[11] = ie0_e_11_qs; |
| reg_rdata_next[12] = ie0_e_12_qs; |
| reg_rdata_next[13] = ie0_e_13_qs; |
| reg_rdata_next[14] = ie0_e_14_qs; |
| reg_rdata_next[15] = ie0_e_15_qs; |
| reg_rdata_next[16] = ie0_e_16_qs; |
| reg_rdata_next[17] = ie0_e_17_qs; |
| reg_rdata_next[18] = ie0_e_18_qs; |
| reg_rdata_next[19] = ie0_e_19_qs; |
| reg_rdata_next[20] = ie0_e_20_qs; |
| reg_rdata_next[21] = ie0_e_21_qs; |
| reg_rdata_next[22] = ie0_e_22_qs; |
| reg_rdata_next[23] = ie0_e_23_qs; |
| reg_rdata_next[24] = ie0_e_24_qs; |
| reg_rdata_next[25] = ie0_e_25_qs; |
| reg_rdata_next[26] = ie0_e_26_qs; |
| reg_rdata_next[27] = ie0_e_27_qs; |
| reg_rdata_next[28] = ie0_e_28_qs; |
| reg_rdata_next[29] = ie0_e_29_qs; |
| reg_rdata_next[30] = ie0_e_30_qs; |
| reg_rdata_next[31] = ie0_e_31_qs; |
| end |
| addr_hit[35]: reg_rdata_next[2:0] = threshold0_qs; |
| addr_hit[36]: reg_rdata_next[5:0] = cc0_qs; |
| addr_hit[37]: reg_rdata_next[0] = msip0_qs; |
| default: reg_rdata_next = {DW {1'sb1}}; |
| endcase |
| end |
| endmodule |
| module rv_plic_target ( |
| clk_i, |
| rst_ni, |
| ip_i, |
| ie_i, |
| prio_i, |
| threshold_i, |
| irq_o, |
| irq_id_o |
| ); |
| parameter signed [31:0] N_SOURCE = 32; |
| parameter signed [31:0] MAX_PRIO = 7; |
| localparam signed [31:0] SrcWidth = $clog2(N_SOURCE + 1); |
| localparam signed [31:0] PrioWidth = $clog2(MAX_PRIO + 1); |
| input clk_i; |
| input rst_ni; |
| input [N_SOURCE - 1:0] ip_i; |
| input [N_SOURCE - 1:0] ie_i; |
| input [(0 >= (N_SOURCE - 1) ? ((2 - N_SOURCE) * PrioWidth) + (((N_SOURCE - 1) * PrioWidth) - 1) : (N_SOURCE * PrioWidth) - 1):(0 >= (N_SOURCE - 1) ? (N_SOURCE - 1) * PrioWidth : 0)] prio_i; |
| input [PrioWidth - 1:0] threshold_i; |
| output wire irq_o; |
| output wire [SrcWidth - 1:0] irq_id_o; |
| localparam signed [31:0] NumLevels = $clog2(N_SOURCE); |
| wire [(2 ** (NumLevels + 1)) - 2:0] is_tree; |
| wire [(((2 ** (NumLevels + 1)) - 2) >= 0 ? (((2 ** (NumLevels + 1)) - 1) * SrcWidth) - 1 : ((3 - (2 ** (NumLevels + 1))) * SrcWidth) + ((((2 ** (NumLevels + 1)) - 2) * SrcWidth) - 1)):(((2 ** (NumLevels + 1)) - 2) >= 0 ? 0 : ((2 ** (NumLevels + 1)) - 2) * SrcWidth)] id_tree; |
| wire [(((2 ** (NumLevels + 1)) - 2) >= 0 ? (((2 ** (NumLevels + 1)) - 1) * PrioWidth) - 1 : ((3 - (2 ** (NumLevels + 1))) * PrioWidth) + ((((2 ** (NumLevels + 1)) - 2) * PrioWidth) - 1)):(((2 ** (NumLevels + 1)) - 2) >= 0 ? 0 : ((2 ** (NumLevels + 1)) - 2) * PrioWidth)] max_tree; |
| generate |
| genvar level; |
| for (level = 0; level < (NumLevels + 1); level = level + 1) begin : gen_tree |
| localparam signed [31:0] Base0 = (2 ** level) - 1; |
| localparam signed [31:0] Base1 = (2 ** (level + 1)) - 1; |
| genvar offset; |
| for (offset = 0; offset < (2 ** level); offset = offset + 1) begin : gen_level |
| localparam signed [31:0] Pa = Base0 + offset; |
| localparam signed [31:0] C0 = Base1 + (2 * offset); |
| localparam signed [31:0] C1 = (Base1 + (2 * offset)) + 1; |
| if (level == NumLevels) begin : gen_leafs |
| if (offset < N_SOURCE) begin : gen_assign |
| assign is_tree[Pa] = ip_i[offset] & ie_i[offset]; |
| assign id_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? Pa : ((2 ** (NumLevels + 1)) - 2) - Pa) * SrcWidth+:SrcWidth] = offset; |
| assign max_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? Pa : ((2 ** (NumLevels + 1)) - 2) - Pa) * PrioWidth+:PrioWidth] = prio_i[(0 >= (N_SOURCE - 1) ? offset : (N_SOURCE - 1) - offset) * PrioWidth+:PrioWidth]; |
| end |
| else begin : gen_tie_off |
| assign is_tree[Pa] = 1'sb0; |
| assign id_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? Pa : ((2 ** (NumLevels + 1)) - 2) - Pa) * SrcWidth+:SrcWidth] = {SrcWidth {1'sb0}}; |
| assign max_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? Pa : ((2 ** (NumLevels + 1)) - 2) - Pa) * PrioWidth+:PrioWidth] = {PrioWidth {1'sb0}}; |
| end |
| end |
| else begin : gen_nodes |
| wire sel; |
| function automatic [0:0] sv2v_cast_1; |
| input reg [0:0] inp; |
| sv2v_cast_1 = inp; |
| endfunction |
| assign sel = (~is_tree[C0] & is_tree[C1]) | ((is_tree[C0] & is_tree[C1]) & sv2v_cast_1(max_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? C1 : ((2 ** (NumLevels + 1)) - 2) - C1) * PrioWidth+:PrioWidth] > max_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? C0 : ((2 ** (NumLevels + 1)) - 2) - C0) * PrioWidth+:PrioWidth])); |
| assign is_tree[Pa] = (sel & is_tree[C1]) | (~sel & is_tree[C0]); |
| assign id_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? Pa : ((2 ** (NumLevels + 1)) - 2) - Pa) * SrcWidth+:SrcWidth] = ({SrcWidth {sel}} & id_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? C1 : ((2 ** (NumLevels + 1)) - 2) - C1) * SrcWidth+:SrcWidth]) | ({SrcWidth {~sel}} & id_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? C0 : ((2 ** (NumLevels + 1)) - 2) - C0) * SrcWidth+:SrcWidth]); |
| assign max_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? Pa : ((2 ** (NumLevels + 1)) - 2) - Pa) * PrioWidth+:PrioWidth] = ({PrioWidth {sel}} & max_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? C1 : ((2 ** (NumLevels + 1)) - 2) - C1) * PrioWidth+:PrioWidth]) | ({PrioWidth {~sel}} & max_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? C0 : ((2 ** (NumLevels + 1)) - 2) - C0) * PrioWidth+:PrioWidth]); |
| end |
| end |
| end |
| endgenerate |
| wire irq_d; |
| reg irq_q; |
| wire [SrcWidth - 1:0] irq_id_d; |
| reg [SrcWidth - 1:0] irq_id_q; |
| assign irq_d = (max_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? 0 : (2 ** (NumLevels + 1)) - 2) * PrioWidth+:PrioWidth] > threshold_i ? is_tree[0] : 1'b0); |
| assign irq_id_d = (is_tree[0] ? id_tree[(((2 ** (NumLevels + 1)) - 2) >= 0 ? 0 : (2 ** (NumLevels + 1)) - 2) * SrcWidth+:SrcWidth] : {SrcWidth {1'sb0}}); |
| always @(posedge clk_i or negedge rst_ni) begin : gen_regs |
| if (!rst_ni) begin |
| irq_q <= 1'b0; |
| irq_id_q <= {SrcWidth {1'sb0}}; |
| end |
| else begin |
| irq_q <= irq_d; |
| irq_id_q <= irq_id_d; |
| end |
| end |
| assign irq_o = irq_q; |
| assign irq_id_o = irq_id_q; |
| endmodule |
| module rv_timer ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| tl_o, |
| intr_timer_expired_0_0_o |
| ); |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_o; |
| output wire intr_timer_expired_0_0_o; |
| localparam signed [31:0] N_HARTS = 1; |
| localparam signed [31:0] N_TIMERS = 1; |
| localparam signed [31:0] rv_timer_reg_pkg_N_HARTS = 1; |
| localparam signed [31:0] rv_timer_reg_pkg_N_TIMERS = 1; |
| localparam [8:0] RV_TIMER_CTRL_OFFSET = 9'h000; |
| localparam [8:0] RV_TIMER_CFG0_OFFSET = 9'h100; |
| localparam [8:0] RV_TIMER_TIMER_V_LOWER0_OFFSET = 9'h104; |
| localparam [8:0] RV_TIMER_TIMER_V_UPPER0_OFFSET = 9'h108; |
| localparam [8:0] RV_TIMER_COMPARE_LOWER0_0_OFFSET = 9'h10c; |
| localparam [8:0] RV_TIMER_COMPARE_UPPER0_0_OFFSET = 9'h110; |
| localparam [8:0] RV_TIMER_INTR_ENABLE0_OFFSET = 9'h114; |
| localparam [8:0] RV_TIMER_INTR_STATE0_OFFSET = 9'h118; |
| localparam [8:0] RV_TIMER_INTR_TEST0_OFFSET = 9'h11c; |
| localparam signed [31:0] RV_TIMER_CTRL = 0; |
| localparam signed [31:0] RV_TIMER_CFG0 = 1; |
| localparam signed [31:0] RV_TIMER_TIMER_V_LOWER0 = 2; |
| localparam signed [31:0] RV_TIMER_TIMER_V_UPPER0 = 3; |
| localparam signed [31:0] RV_TIMER_COMPARE_LOWER0_0 = 4; |
| localparam signed [31:0] RV_TIMER_COMPARE_UPPER0_0 = 5; |
| localparam signed [31:0] RV_TIMER_INTR_ENABLE0 = 6; |
| localparam signed [31:0] RV_TIMER_INTR_STATE0 = 7; |
| localparam signed [31:0] RV_TIMER_INTR_TEST0 = 8; |
| localparam [35:0] RV_TIMER_PERMIT = {4'b0001, 4'b0111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b0001, 4'b0001, 4'b0001}; |
| wire [154:0] reg2hw; |
| wire [67:0] hw2reg; |
| wire [N_HARTS - 1:0] active; |
| wire [((2 - N_HARTS) * 12) + (((N_HARTS - 1) * 12) - 1):(N_HARTS - 1) * 12] prescaler; |
| wire [((2 - N_HARTS) * 8) + (((N_HARTS - 1) * 8) - 1):(N_HARTS - 1) * 8] step; |
| wire [N_HARTS - 1:0] tick; |
| wire [63:0] mtime_d [0:N_HARTS - 1]; |
| wire [63:0] mtime [0:N_HARTS - 1]; |
| wire [((((((2 - N_HARTS) * (2 - N_TIMERS)) + (((N_TIMERS - 1) + ((N_HARTS - 1) * (2 - N_TIMERS))) - 1)) - ((N_TIMERS - 1) + ((N_HARTS - 1) * (2 - N_TIMERS)))) + 1) * 64) + ((((N_TIMERS - 1) + ((N_HARTS - 1) * (2 - N_TIMERS))) * 64) - 1):((N_TIMERS - 1) + ((N_HARTS - 1) * (2 - N_TIMERS))) * 64] mtimecmp; |
| wire mtimecmp_update [0:N_HARTS - 1][0:N_TIMERS - 1]; |
| wire [(N_HARTS * N_TIMERS) - 1:0] intr_timer_set; |
| wire [(N_HARTS * N_TIMERS) - 1:0] intr_timer_en; |
| wire [(N_HARTS * N_TIMERS) - 1:0] intr_timer_test_q; |
| wire [N_HARTS - 1:0] intr_timer_test_qe; |
| wire [(N_HARTS * N_TIMERS) - 1:0] intr_timer_state_q; |
| wire [N_HARTS - 1:0] intr_timer_state_de; |
| wire [(N_HARTS * N_TIMERS) - 1:0] intr_timer_state_d; |
| wire [(N_HARTS * N_TIMERS) - 1:0] intr_out; |
| assign active[0] = reg2hw[154]; |
| assign prescaler = reg2hw[153-:12]; |
| assign step = reg2hw[141-:8]; |
| assign hw2reg[2] = tick[0]; |
| assign hw2reg[35] = tick[0]; |
| assign hw2reg[34-:32] = mtime_d[0][63:32]; |
| assign hw2reg[67-:32] = mtime_d[0][31:0]; |
| assign mtime[0] = {reg2hw[101-:32], reg2hw[133-:32]}; |
| assign mtimecmp = {reg2hw[36-:32], reg2hw[69-:32]}; |
| assign mtimecmp_update[0][0] = reg2hw[4] | reg2hw[37]; |
| assign intr_timer_expired_0_0_o = intr_out[0]; |
| assign intr_timer_en = reg2hw[3]; |
| assign intr_timer_state_q = reg2hw[2]; |
| assign intr_timer_test_q = reg2hw[1]; |
| assign intr_timer_test_qe = reg2hw[0]; |
| assign hw2reg[0] = intr_timer_state_de | mtimecmp_update[0][0]; |
| assign hw2reg[1] = intr_timer_state_d & ~mtimecmp_update[0][0]; |
| generate |
| genvar h; |
| for (h = 0; h < N_HARTS; h = h + 1) begin : gen_harts |
| prim_intr_hw #(.Width(N_TIMERS)) u_intr_hw( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .event_intr_i(intr_timer_set), |
| .reg2hw_intr_enable_q_i(intr_timer_en[h * N_TIMERS+:N_TIMERS]), |
| .reg2hw_intr_test_q_i(intr_timer_test_q[h * N_TIMERS+:N_TIMERS]), |
| .reg2hw_intr_test_qe_i(intr_timer_test_qe[h]), |
| .reg2hw_intr_state_q_i(intr_timer_state_q[h * N_TIMERS+:N_TIMERS]), |
| .hw2reg_intr_state_de_o(intr_timer_state_de), |
| .hw2reg_intr_state_d_o(intr_timer_state_d[h * N_TIMERS+:N_TIMERS]), |
| .intr_o(intr_out[h * N_TIMERS+:N_TIMERS]) |
| ); |
| timer_core #(.N(N_TIMERS)) u_core( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .active(active[h]), |
| .prescaler(prescaler[h * 12+:12]), |
| .step(step[h * 8+:8]), |
| .tick(tick[h]), |
| .mtime_d(mtime_d[h]), |
| .mtime(mtime[h]), |
| .mtimecmp(mtimecmp[64 * ((N_TIMERS - 1) + (h * (2 - N_TIMERS)))+:64 * (2 - N_TIMERS)]), |
| .intr(intr_timer_set[h * N_TIMERS+:N_TIMERS]) |
| ); |
| end |
| endgenerate |
| rv_timer_reg_top u_reg( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(tl_i), |
| .tl_o(tl_o), |
| .reg2hw(reg2hw), |
| .hw2reg(hw2reg), |
| .devmode_i(1'b1) |
| ); |
| endmodule |
| module rv_timer_reg_top ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| tl_o, |
| reg2hw, |
| hw2reg, |
| devmode_i |
| ); |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_o; |
| output wire [154:0] reg2hw; |
| input wire [67:0] hw2reg; |
| input devmode_i; |
| localparam signed [31:0] N_HARTS = 1; |
| localparam signed [31:0] N_TIMERS = 1; |
| localparam [8:0] RV_TIMER_CTRL_OFFSET = 9'h000; |
| localparam [8:0] RV_TIMER_CFG0_OFFSET = 9'h100; |
| localparam [8:0] RV_TIMER_TIMER_V_LOWER0_OFFSET = 9'h104; |
| localparam [8:0] RV_TIMER_TIMER_V_UPPER0_OFFSET = 9'h108; |
| localparam [8:0] RV_TIMER_COMPARE_LOWER0_0_OFFSET = 9'h10c; |
| localparam [8:0] RV_TIMER_COMPARE_UPPER0_0_OFFSET = 9'h110; |
| localparam [8:0] RV_TIMER_INTR_ENABLE0_OFFSET = 9'h114; |
| localparam [8:0] RV_TIMER_INTR_STATE0_OFFSET = 9'h118; |
| localparam [8:0] RV_TIMER_INTR_TEST0_OFFSET = 9'h11c; |
| localparam signed [31:0] RV_TIMER_CTRL = 0; |
| localparam signed [31:0] RV_TIMER_CFG0 = 1; |
| localparam signed [31:0] RV_TIMER_TIMER_V_LOWER0 = 2; |
| localparam signed [31:0] RV_TIMER_TIMER_V_UPPER0 = 3; |
| localparam signed [31:0] RV_TIMER_COMPARE_LOWER0_0 = 4; |
| localparam signed [31:0] RV_TIMER_COMPARE_UPPER0_0 = 5; |
| localparam signed [31:0] RV_TIMER_INTR_ENABLE0 = 6; |
| localparam signed [31:0] RV_TIMER_INTR_STATE0 = 7; |
| localparam signed [31:0] RV_TIMER_INTR_TEST0 = 8; |
| localparam [35:0] RV_TIMER_PERMIT = {4'b0001, 4'b0111, 4'b1111, 4'b1111, 4'b1111, 4'b1111, 4'b0001, 4'b0001, 4'b0001}; |
| localparam signed [31:0] AW = 9; |
| localparam signed [31:0] DW = 32; |
| localparam signed [31:0] DBW = DW / 8; |
| wire reg_we; |
| wire reg_re; |
| wire [AW - 1:0] reg_addr; |
| wire [DW - 1:0] reg_wdata; |
| wire [DBW - 1:0] reg_be; |
| wire [DW - 1:0] reg_rdata; |
| wire reg_error; |
| wire addrmiss; |
| reg wr_err; |
| reg [DW - 1:0] reg_rdata_next; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_reg_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_reg_d2h; |
| assign tl_reg_h2d = tl_i; |
| assign tl_o = tl_reg_d2h; |
| tlul_adapter_reg #( |
| .RegAw(AW), |
| .RegDw(DW) |
| ) u_reg_if( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(tl_reg_h2d), |
| .tl_o(tl_reg_d2h), |
| .we_o(reg_we), |
| .re_o(reg_re), |
| .addr_o(reg_addr), |
| .wdata_o(reg_wdata), |
| .be_o(reg_be), |
| .rdata_i(reg_rdata), |
| .error_i(reg_error) |
| ); |
| assign reg_rdata = reg_rdata_next; |
| assign reg_error = (devmode_i & addrmiss) | wr_err; |
| wire ctrl_qs; |
| wire ctrl_wd; |
| wire ctrl_we; |
| wire [11:0] cfg0_prescale_qs; |
| wire [11:0] cfg0_prescale_wd; |
| wire cfg0_prescale_we; |
| wire [7:0] cfg0_step_qs; |
| wire [7:0] cfg0_step_wd; |
| wire cfg0_step_we; |
| wire [31:0] timer_v_lower0_qs; |
| wire [31:0] timer_v_lower0_wd; |
| wire timer_v_lower0_we; |
| wire [31:0] timer_v_upper0_qs; |
| wire [31:0] timer_v_upper0_wd; |
| wire timer_v_upper0_we; |
| wire [31:0] compare_lower0_0_qs; |
| wire [31:0] compare_lower0_0_wd; |
| wire compare_lower0_0_we; |
| wire [31:0] compare_upper0_0_qs; |
| wire [31:0] compare_upper0_0_wd; |
| wire compare_upper0_0_we; |
| wire intr_enable0_qs; |
| wire intr_enable0_wd; |
| wire intr_enable0_we; |
| wire intr_state0_qs; |
| wire intr_state0_wd; |
| wire intr_state0_we; |
| wire intr_test0_wd; |
| wire intr_test0_we; |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ctrl( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_we), |
| .wd(ctrl_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[154]), |
| .qs(ctrl_qs) |
| ); |
| prim_subreg #( |
| .DW(12), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(12'h000) |
| ) u_cfg0_prescale( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(cfg0_prescale_we), |
| .wd(cfg0_prescale_wd), |
| .de(1'b0), |
| .d({12 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[153-:12]), |
| .qs(cfg0_prescale_qs) |
| ); |
| prim_subreg #( |
| .DW(8), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(8'h01) |
| ) u_cfg0_step( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(cfg0_step_we), |
| .wd(cfg0_step_wd), |
| .de(1'b0), |
| .d({8 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[141-:8]), |
| .qs(cfg0_step_qs) |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(32'h00000000) |
| ) u_timer_v_lower0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(timer_v_lower0_we), |
| .wd(timer_v_lower0_wd), |
| .de(hw2reg[35]), |
| .d(hw2reg[67-:32]), |
| .qe(), |
| .q(reg2hw[133-:32]), |
| .qs(timer_v_lower0_qs) |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(32'h00000000) |
| ) u_timer_v_upper0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(timer_v_upper0_we), |
| .wd(timer_v_upper0_wd), |
| .de(hw2reg[2]), |
| .d(hw2reg[34-:32]), |
| .qe(), |
| .q(reg2hw[101-:32]), |
| .qs(timer_v_upper0_qs) |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(32'hffffffff) |
| ) u_compare_lower0_0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(compare_lower0_0_we), |
| .wd(compare_lower0_0_wd), |
| .de(1'b0), |
| .d({32 {1'sb0}}), |
| .qe(reg2hw[37]), |
| .q(reg2hw[69-:32]), |
| .qs(compare_lower0_0_qs) |
| ); |
| prim_subreg #( |
| .DW(32), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(32'hffffffff) |
| ) u_compare_upper0_0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(compare_upper0_0_we), |
| .wd(compare_upper0_0_wd), |
| .de(1'b0), |
| .d({32 {1'sb0}}), |
| .qe(reg2hw[4]), |
| .q(reg2hw[36-:32]), |
| .qs(compare_upper0_0_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_intr_enable0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_enable0_we), |
| .wd(intr_enable0_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[3]), |
| .qs(intr_enable0_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(24), |
| .SWACCESS("W1C"), |
| .RESVAL(1'h0) |
| ) u_intr_state0( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_state0_we), |
| .wd(intr_state0_wd), |
| .de(hw2reg[0]), |
| .d(hw2reg[1]), |
| .qe(), |
| .q(reg2hw[2]), |
| .qs(intr_state0_qs) |
| ); |
| prim_subreg_ext #(.DW(1)) u_intr_test0( |
| .re(1'b0), |
| .we(intr_test0_we), |
| .wd(intr_test0_wd), |
| .d(1'sb0), |
| .qre(), |
| .qe(reg2hw[0]), |
| .q(reg2hw[1]), |
| .qs() |
| ); |
| reg [8:0] addr_hit; |
| always @(*) begin |
| addr_hit = {9 {1'sb0}}; |
| addr_hit[0] = reg_addr == RV_TIMER_CTRL_OFFSET; |
| addr_hit[1] = reg_addr == RV_TIMER_CFG0_OFFSET; |
| addr_hit[2] = reg_addr == RV_TIMER_TIMER_V_LOWER0_OFFSET; |
| addr_hit[3] = reg_addr == RV_TIMER_TIMER_V_UPPER0_OFFSET; |
| addr_hit[4] = reg_addr == RV_TIMER_COMPARE_LOWER0_0_OFFSET; |
| addr_hit[5] = reg_addr == RV_TIMER_COMPARE_UPPER0_0_OFFSET; |
| addr_hit[6] = reg_addr == RV_TIMER_INTR_ENABLE0_OFFSET; |
| addr_hit[7] = reg_addr == RV_TIMER_INTR_STATE0_OFFSET; |
| addr_hit[8] = reg_addr == RV_TIMER_INTR_TEST0_OFFSET; |
| end |
| assign addrmiss = (reg_re || reg_we ? ~|addr_hit : 1'b0); |
| always @(*) begin |
| wr_err = 1'b0; |
| if ((addr_hit[0] && reg_we) && (RV_TIMER_PERMIT[32+:4] != (RV_TIMER_PERMIT[32+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[1] && reg_we) && (RV_TIMER_PERMIT[28+:4] != (RV_TIMER_PERMIT[28+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[2] && reg_we) && (RV_TIMER_PERMIT[24+:4] != (RV_TIMER_PERMIT[24+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[3] && reg_we) && (RV_TIMER_PERMIT[20+:4] != (RV_TIMER_PERMIT[20+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[4] && reg_we) && (RV_TIMER_PERMIT[16+:4] != (RV_TIMER_PERMIT[16+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[5] && reg_we) && (RV_TIMER_PERMIT[12+:4] != (RV_TIMER_PERMIT[12+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[6] && reg_we) && (RV_TIMER_PERMIT[8+:4] != (RV_TIMER_PERMIT[8+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[7] && reg_we) && (RV_TIMER_PERMIT[4+:4] != (RV_TIMER_PERMIT[4+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[8] && reg_we) && (RV_TIMER_PERMIT[0+:4] != (RV_TIMER_PERMIT[0+:4] & reg_be))) |
| wr_err = 1'b1; |
| end |
| assign ctrl_we = (addr_hit[0] & reg_we) & ~wr_err; |
| assign ctrl_wd = reg_wdata[0]; |
| assign cfg0_prescale_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign cfg0_prescale_wd = reg_wdata[11:0]; |
| assign cfg0_step_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign cfg0_step_wd = reg_wdata[23:16]; |
| assign timer_v_lower0_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign timer_v_lower0_wd = reg_wdata[31:0]; |
| assign timer_v_upper0_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign timer_v_upper0_wd = reg_wdata[31:0]; |
| assign compare_lower0_0_we = (addr_hit[4] & reg_we) & ~wr_err; |
| assign compare_lower0_0_wd = reg_wdata[31:0]; |
| assign compare_upper0_0_we = (addr_hit[5] & reg_we) & ~wr_err; |
| assign compare_upper0_0_wd = reg_wdata[31:0]; |
| assign intr_enable0_we = (addr_hit[6] & reg_we) & ~wr_err; |
| assign intr_enable0_wd = reg_wdata[0]; |
| assign intr_state0_we = (addr_hit[7] & reg_we) & ~wr_err; |
| assign intr_state0_wd = reg_wdata[0]; |
| assign intr_test0_we = (addr_hit[8] & reg_we) & ~wr_err; |
| assign intr_test0_wd = reg_wdata[0]; |
| always @(*) begin |
| reg_rdata_next = {DW {1'sb0}}; |
| case (1'b1) |
| addr_hit[0]: reg_rdata_next[0] = ctrl_qs; |
| addr_hit[1]: begin |
| reg_rdata_next[11:0] = cfg0_prescale_qs; |
| reg_rdata_next[23:16] = cfg0_step_qs; |
| end |
| addr_hit[2]: reg_rdata_next[31:0] = timer_v_lower0_qs; |
| addr_hit[3]: reg_rdata_next[31:0] = timer_v_upper0_qs; |
| addr_hit[4]: reg_rdata_next[31:0] = compare_lower0_0_qs; |
| addr_hit[5]: reg_rdata_next[31:0] = compare_upper0_0_qs; |
| addr_hit[6]: reg_rdata_next[0] = intr_enable0_qs; |
| addr_hit[7]: reg_rdata_next[0] = intr_state0_qs; |
| addr_hit[8]: reg_rdata_next[0] = 1'sb0; |
| default: reg_rdata_next = {DW {1'sb1}}; |
| endcase |
| end |
| endmodule |
| module timer_core ( |
| clk_i, |
| rst_ni, |
| active, |
| prescaler, |
| step, |
| tick, |
| mtime_d, |
| mtime, |
| mtimecmp, |
| intr |
| ); |
| parameter signed [31:0] N = 1; |
| input clk_i; |
| input rst_ni; |
| input active; |
| input [11:0] prescaler; |
| input [7:0] step; |
| output wire tick; |
| output wire [63:0] mtime_d; |
| input [63:0] mtime; |
| input [(0 >= (N - 1) ? ((2 - N) * 64) + (((N - 1) * 64) - 1) : (N * 64) - 1):(0 >= (N - 1) ? (N - 1) * 64 : 0)] mtimecmp; |
| output wire [N - 1:0] intr; |
| reg [11:0] tick_count; |
| always @(posedge clk_i or negedge rst_ni) begin : generate_tick |
| if (!rst_ni) |
| tick_count <= 12'h000; |
| else if (!active) |
| tick_count <= 12'h000; |
| else if (tick_count == prescaler) |
| tick_count <= 12'h000; |
| else |
| tick_count <= tick_count + 1'b1; |
| end |
| assign tick = active & (tick_count >= prescaler); |
| function automatic [63:0] sv2v_cast_64; |
| input reg [63:0] inp; |
| sv2v_cast_64 = inp; |
| endfunction |
| assign mtime_d = mtime + sv2v_cast_64(step); |
| generate |
| genvar t; |
| for (t = 0; t < N; t = t + 1) begin : gen_intr |
| assign intr[t] = active & (mtime >= mtimecmp[(0 >= (N - 1) ? t : (N - 1) - t) * 64+:64]); |
| end |
| endgenerate |
| endmodule |
| module tlul_adapter_host ( |
| clk_i, |
| rst_ni, |
| req_i, |
| gnt_o, |
| addr_i, |
| we_i, |
| wdata_i, |
| be_i, |
| valid_o, |
| rdata_o, |
| err_o, |
| tl_o, |
| tl_i |
| ); |
| parameter [31:0] MAX_REQS = 2; |
| input clk_i; |
| input rst_ni; |
| input req_i; |
| output wire gnt_o; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| input wire [top_pkg_TL_AW - 1:0] addr_i; |
| input wire we_i; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| input wire [top_pkg_TL_DW - 1:0] wdata_i; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| input wire [top_pkg_TL_DBW - 1:0] be_i; |
| output wire valid_o; |
| output wire [top_pkg_TL_DW - 1:0] rdata_o; |
| output wire err_o; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_o; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_i; |
| localparam signed [31:0] WordSize = $clog2(top_pkg_TL_DBW); |
| wire [top_pkg_TL_AIW - 1:0] tl_source; |
| wire [top_pkg_TL_DBW - 1:0] tl_be; |
| generate |
| if (MAX_REQS == 1) begin : g_single_req |
| assign tl_source = {top_pkg_TL_AIW {1'sb0}}; |
| end |
| else begin : g_multiple_reqs |
| localparam signed [31:0] ReqNumW = $clog2(MAX_REQS); |
| reg [ReqNumW - 1:0] source_d; |
| reg [ReqNumW - 1:0] source_q; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| source_q <= {ReqNumW {1'sb0}}; |
| else |
| source_q <= source_d; |
| always @(*) begin |
| source_d = source_q; |
| if (req_i && gnt_o) |
| if (source_q == (MAX_REQS - 1)) |
| source_d = {ReqNumW {1'sb0}}; |
| else |
| source_d = source_q + 1; |
| end |
| function automatic [7:0] sv2v_cast_8; |
| input reg [7:0] inp; |
| sv2v_cast_8 = inp; |
| endfunction |
| assign tl_source = sv2v_cast_8(source_q); |
| end |
| endgenerate |
| assign tl_be = (~we_i ? {top_pkg_TL_DBW {1'b1}} : be_i); |
| localparam [2:0] tlul_pkg_Get = 3'h4; |
| localparam [2:0] tlul_pkg_PutFullData = 3'h0; |
| localparam [2:0] tlul_pkg_PutPartialData = 3'h1; |
| function automatic signed [top_pkg_TL_SZW - 1:0] sv2v_cast_38DDD_signed; |
| input reg signed [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_38DDD_signed = inp; |
| endfunction |
| function automatic [0:0] sv2v_cast_1; |
| input reg [0:0] inp; |
| sv2v_cast_1 = inp; |
| endfunction |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| function automatic [top_pkg_TL_SZW - 1:0] sv2v_cast_F00AF; |
| input reg [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_F00AF = inp; |
| endfunction |
| function automatic [top_pkg_TL_AIW - 1:0] sv2v_cast_F1F18; |
| input reg [top_pkg_TL_AIW - 1:0] inp; |
| sv2v_cast_F1F18 = inp; |
| endfunction |
| function automatic [top_pkg_TL_AW - 1:0] sv2v_cast_4CD75; |
| input reg [top_pkg_TL_AW - 1:0] inp; |
| sv2v_cast_4CD75 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DBW - 1:0] sv2v_cast_37199; |
| input reg [top_pkg_TL_DBW - 1:0] inp; |
| sv2v_cast_37199 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DW - 1:0] sv2v_cast_2497D; |
| input reg [top_pkg_TL_DW - 1:0] inp; |
| sv2v_cast_2497D = inp; |
| endfunction |
| function automatic [15:0] sv2v_cast_16; |
| input reg [15:0] inp; |
| sv2v_cast_16 = inp; |
| endfunction |
| assign tl_o = {sv2v_cast_1(req_i), sv2v_cast_3((~we_i ? tlul_pkg_Get : (&be_i ? tlul_pkg_PutFullData : tlul_pkg_PutPartialData))), 3'h0, sv2v_cast_F00AF(sv2v_cast_38DDD_signed(WordSize)), sv2v_cast_F1F18(tl_source), sv2v_cast_4CD75({addr_i[31:WordSize], {WordSize {1'b0}}}), sv2v_cast_37199(tl_be), sv2v_cast_2497D(wdata_i), sv2v_cast_16({7'b0000000, 1'sb0, 8'b00000000}), 1'b1}; |
| assign gnt_o = tl_i[0]; |
| assign valid_o = tl_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))]; |
| assign rdata_o = tl_i[top_pkg_TL_DW + (top_pkg_TL_DUW + 1)-:((top_pkg_TL_DW + (top_pkg_TL_DUW + 1)) - (top_pkg_TL_DUW + 2)) + 1]; |
| assign err_o = tl_i[1]; |
| endmodule |
| module tlul_adapter_reg ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| tl_o, |
| re_o, |
| we_o, |
| addr_o, |
| wdata_o, |
| be_o, |
| rdata_i, |
| error_i |
| ); |
| localparam ArbiterImpl = "PPC"; |
| localparam [31:0] ADDR_SPACE_UART = 32'h40000000; |
| localparam [31:0] ADDR_SPACE_GPIO = 32'h40010000; |
| localparam [31:0] ADDR_SPACE_SRAMD = 32'h18000000; |
| localparam [31:0] ADDR_SPACE_SRAMI = 32'h00080000; |
| localparam [31:0] ADDR_SPACE_DEBUG_MEM = 32'h1a110000; |
| localparam [31:0] ADDR_SPACE_RV_PLIC = 32'h40090000; |
| localparam [31:0] ADDR_SPACE_SPI_DEVICE = 32'h40020000; |
| localparam [31:0] ADDR_SPACE_RV_TIMER = 32'h40080000; |
| localparam [31:0] ADDR_MASK_UART = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_GPIO = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SRAMD = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_SRAMI = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_DEBUG_MEM = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_PLIC = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SPI_DEVICE = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_TIMER = 32'h00000fff; |
| localparam [2:0] PutFullData = 3'h0; |
| localparam [2:0] PutPartialData = 3'h1; |
| localparam [2:0] Get = 3'h4; |
| localparam [2:0] AccessAck = 3'h0; |
| localparam [2:0] AccessAckData = 3'h1; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| function automatic [top_pkg_TL_SZW - 1:0] sv2v_cast_F00AF; |
| input reg [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_F00AF = inp; |
| endfunction |
| function automatic [top_pkg_TL_AIW - 1:0] sv2v_cast_F1F18; |
| input reg [top_pkg_TL_AIW - 1:0] inp; |
| sv2v_cast_F1F18 = inp; |
| endfunction |
| function automatic [top_pkg_TL_AW - 1:0] sv2v_cast_4CD75; |
| input reg [top_pkg_TL_AW - 1:0] inp; |
| sv2v_cast_4CD75 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DBW - 1:0] sv2v_cast_37199; |
| input reg [top_pkg_TL_DBW - 1:0] inp; |
| sv2v_cast_37199 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DW - 1:0] sv2v_cast_2497D; |
| input reg [top_pkg_TL_DW - 1:0] inp; |
| sv2v_cast_2497D = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] TL_H2D_DEFAULT = {1'sb0, 3'b000, 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_4CD75(1'sb0), sv2v_cast_37199(1'sb0), sv2v_cast_2497D(1'sb0), 16'b0000000000000000, 1'b1}; |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| function automatic [top_pkg_TL_DIW - 1:0] sv2v_cast_B5AB2; |
| input reg [top_pkg_TL_DIW - 1:0] inp; |
| sv2v_cast_B5AB2 = inp; |
| endfunction |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| function automatic [top_pkg_TL_DUW - 1:0] sv2v_cast_92577; |
| input reg [top_pkg_TL_DUW - 1:0] inp; |
| sv2v_cast_92577 = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] TL_D2H_DEFAULT = {1'sb0, sv2v_cast_3(3'b000), 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_B5AB2(1'sb0), sv2v_cast_2497D(1'sb0), sv2v_cast_92577(1'sb0), 1'sb0, 1'b1}; |
| parameter signed [31:0] RegAw = 8; |
| parameter signed [31:0] RegDw = 32; |
| localparam signed [31:0] RegBw = RegDw / 8; |
| input clk_i; |
| input rst_ni; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_o; |
| output wire re_o; |
| output wire we_o; |
| output wire [RegAw - 1:0] addr_o; |
| output wire [RegDw - 1:0] wdata_o; |
| output wire [RegBw - 1:0] be_o; |
| input [RegDw - 1:0] rdata_i; |
| input error_i; |
| localparam signed [31:0] IW = top_pkg_TL_AIW; |
| localparam signed [31:0] SZW = top_pkg_TL_SZW; |
| reg outstanding; |
| wire a_ack; |
| wire d_ack; |
| reg [RegDw - 1:0] rdata; |
| reg error; |
| wire err_internal; |
| reg addr_align_err; |
| wire malformed_meta_err; |
| wire tl_err; |
| reg [IW - 1:0] reqid; |
| reg [SZW - 1:0] reqsz; |
| reg [2:0] rspop; |
| wire rd_req; |
| wire wr_req; |
| assign a_ack = tl_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] & tl_o[0]; |
| assign d_ack = tl_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))] & tl_i[0]; |
| assign wr_req = a_ack & ((tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == PutFullData) | (tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == PutPartialData)); |
| assign rd_req = a_ack & (tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == Get); |
| assign we_o = wr_req & ~err_internal; |
| assign re_o = rd_req & ~err_internal; |
| assign addr_o = {tl_i[(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - ((top_pkg_TL_AW - 1) - (RegAw - 1)):(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_AW - 3)], 2'b00}; |
| assign wdata_o = tl_i[top_pkg_TL_DW + 16-:top_pkg_TL_DW]; |
| assign be_o = tl_i[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)]; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| outstanding <= 1'b0; |
| else if (a_ack) |
| outstanding <= 1'b1; |
| else if (d_ack) |
| outstanding <= 1'b0; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| reqid <= {IW {1'sb0}}; |
| reqsz <= {SZW {1'sb0}}; |
| rspop <= AccessAck; |
| end |
| else if (a_ack) begin |
| reqid <= tl_i[top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))-:((40 + (top_pkg_TL_DBW + 48)) >= (32 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) + 1 : ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + 1)]; |
| reqsz <= tl_i[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)]; |
| rspop <= (rd_req ? AccessAckData : AccessAck); |
| end |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| rdata <= {RegDw {1'sb0}}; |
| error <= 1'b0; |
| end |
| else if (a_ack) begin |
| rdata <= (err_internal ? {RegDw {1'sb1}} : rdata_i); |
| error <= error_i | err_internal; |
| end |
| function automatic [0:0] sv2v_cast_1; |
| input reg [0:0] inp; |
| sv2v_cast_1 = inp; |
| endfunction |
| assign tl_o = {sv2v_cast_1(outstanding), sv2v_cast_3(rspop), 3'b000, sv2v_cast_F00AF(reqsz), sv2v_cast_F1F18(reqid), sv2v_cast_B5AB2(1'sb0), sv2v_cast_2497D(rdata), sv2v_cast_92577(1'sb0), sv2v_cast_1(error), sv2v_cast_1(~outstanding)}; |
| assign err_internal = (addr_align_err | malformed_meta_err) | tl_err; |
| assign malformed_meta_err = tl_i[9] == 1'b1; |
| always @(*) |
| if (wr_req) |
| addr_align_err = |tl_i[(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_AW - 2):(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_AW - 1)]; |
| else |
| addr_align_err = 1'b0; |
| tlul_err u_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(tl_i), |
| .err_o(tl_err) |
| ); |
| endmodule |
| module tlul_adapter_sram ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| tl_o, |
| req_o, |
| gnt_i, |
| we_o, |
| addr_o, |
| wdata_o, |
| wmask_o, |
| rdata_i, |
| rvalid_i, |
| rerror_i |
| ); |
| parameter signed [31:0] SramAw = 12; |
| parameter signed [31:0] SramDw = 32; |
| parameter signed [31:0] Outstanding = 1; |
| parameter [0:0] ByteAccess = 1; |
| parameter [0:0] ErrOnWrite = 0; |
| parameter [0:0] ErrOnRead = 0; |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_o; |
| output wire req_o; |
| input gnt_i; |
| output wire we_o; |
| output wire [SramAw - 1:0] addr_o; |
| output wire [SramDw - 1:0] wdata_o; |
| output wire [SramDw - 1:0] wmask_o; |
| input [SramDw - 1:0] rdata_i; |
| input rvalid_i; |
| input [1:0] rerror_i; |
| localparam ArbiterImpl = "PPC"; |
| localparam [31:0] ADDR_SPACE_UART = 32'h40000000; |
| localparam [31:0] ADDR_SPACE_GPIO = 32'h40010000; |
| localparam [31:0] ADDR_SPACE_SRAMD = 32'h18000000; |
| localparam [31:0] ADDR_SPACE_SRAMI = 32'h00080000; |
| localparam [31:0] ADDR_SPACE_DEBUG_MEM = 32'h1a110000; |
| localparam [31:0] ADDR_SPACE_RV_PLIC = 32'h40090000; |
| localparam [31:0] ADDR_SPACE_SPI_DEVICE = 32'h40020000; |
| localparam [31:0] ADDR_SPACE_RV_TIMER = 32'h40080000; |
| localparam [31:0] ADDR_MASK_UART = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_GPIO = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SRAMD = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_SRAMI = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_DEBUG_MEM = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_PLIC = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SPI_DEVICE = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_TIMER = 32'h00000fff; |
| localparam [2:0] PutFullData = 3'h0; |
| localparam [2:0] PutPartialData = 3'h1; |
| localparam [2:0] Get = 3'h4; |
| localparam [2:0] AccessAck = 3'h0; |
| localparam [2:0] AccessAckData = 3'h1; |
| function automatic [top_pkg_TL_SZW - 1:0] sv2v_cast_F00AF; |
| input reg [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_F00AF = inp; |
| endfunction |
| function automatic [top_pkg_TL_AIW - 1:0] sv2v_cast_F1F18; |
| input reg [top_pkg_TL_AIW - 1:0] inp; |
| sv2v_cast_F1F18 = inp; |
| endfunction |
| function automatic [top_pkg_TL_AW - 1:0] sv2v_cast_4CD75; |
| input reg [top_pkg_TL_AW - 1:0] inp; |
| sv2v_cast_4CD75 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DBW - 1:0] sv2v_cast_37199; |
| input reg [top_pkg_TL_DBW - 1:0] inp; |
| sv2v_cast_37199 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DW - 1:0] sv2v_cast_2497D; |
| input reg [top_pkg_TL_DW - 1:0] inp; |
| sv2v_cast_2497D = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] TL_H2D_DEFAULT = {1'sb0, 3'b000, 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_4CD75(1'sb0), sv2v_cast_37199(1'sb0), sv2v_cast_2497D(1'sb0), 16'b0000000000000000, 1'b1}; |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DIW - 1:0] sv2v_cast_B5AB2; |
| input reg [top_pkg_TL_DIW - 1:0] inp; |
| sv2v_cast_B5AB2 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DUW - 1:0] sv2v_cast_92577; |
| input reg [top_pkg_TL_DUW - 1:0] inp; |
| sv2v_cast_92577 = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] TL_D2H_DEFAULT = {1'sb0, sv2v_cast_3(3'b000), 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_B5AB2(1'sb0), sv2v_cast_2497D(1'sb0), sv2v_cast_92577(1'sb0), 1'sb0, 1'b1}; |
| localparam signed [31:0] SramByte = SramDw / 8; |
| function automatic integer prim_util_pkg_vbits; |
| input integer value; |
| prim_util_pkg_vbits = (value == 1 ? 1 : $clog2(value)); |
| endfunction |
| localparam signed [31:0] DataBitWidth = prim_util_pkg_vbits(SramByte); |
| localparam signed [31:0] WidthMult = SramDw / top_pkg_TL_DW; |
| localparam signed [31:0] WoffsetWidth = (SramByte == top_pkg_TL_DBW ? 1 : DataBitWidth - prim_util_pkg_vbits(top_pkg_TL_DBW)); |
| localparam signed [31:0] SramReqFifoWidth = top_pkg_TL_DBW + WoffsetWidth; |
| localparam signed [31:0] ReqFifoWidth = (3 + top_pkg_TL_SZW) + top_pkg_TL_AIW; |
| localparam signed [31:0] RspFifoWidth = (SramDw >= 0 ? SramDw + 1 : 1 - SramDw); |
| wire reqfifo_wvalid; |
| wire reqfifo_wready; |
| wire reqfifo_rvalid; |
| wire reqfifo_rready; |
| wire [((3 + top_pkg_TL_SZW) + top_pkg_TL_AIW) - 1:0] reqfifo_wdata; |
| wire [((3 + top_pkg_TL_SZW) + top_pkg_TL_AIW) - 1:0] reqfifo_rdata; |
| wire sramreqfifo_wvalid; |
| wire sramreqfifo_wready; |
| wire sramreqfifo_rready; |
| wire [(top_pkg_TL_DBW + WoffsetWidth) - 1:0] sramreqfifo_wdata; |
| wire [(top_pkg_TL_DBW + WoffsetWidth) - 1:0] sramreqfifo_rdata; |
| wire rspfifo_wvalid; |
| wire rspfifo_wready; |
| wire rspfifo_rvalid; |
| wire rspfifo_rready; |
| wire [SramDw:0] rspfifo_wdata; |
| wire [SramDw:0] rspfifo_rdata; |
| wire error_internal; |
| wire wr_attr_error; |
| wire wr_vld_error; |
| wire rd_vld_error; |
| wire tlul_error; |
| wire a_ack; |
| wire d_ack; |
| wire sram_ack; |
| assign a_ack = tl_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] & tl_o[0]; |
| assign d_ack = tl_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))] & tl_i[0]; |
| assign sram_ack = req_o & gnt_i; |
| reg d_valid; |
| reg d_error; |
| localparam [1:0] OpRead = 1; |
| always @(*) begin |
| d_valid = 1'b0; |
| if (reqfifo_rvalid) begin |
| if (reqfifo_rdata[1 + (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1))]) |
| d_valid = 1'b1; |
| else if (reqfifo_rdata[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1))-:((3 + (top_pkg_TL_SZW + 7)) >= (1 + (top_pkg_TL_SZW + 8)) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1))) - (1 + (top_pkg_TL_SZW + top_pkg_TL_AIW))) + 1 : ((1 + (top_pkg_TL_SZW + top_pkg_TL_AIW)) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1)))) + 1)] == OpRead) |
| d_valid = rspfifo_rvalid; |
| else |
| d_valid = 1'b1; |
| end |
| else |
| d_valid = 1'b0; |
| end |
| always @(*) begin |
| d_error = 1'b0; |
| if (reqfifo_rvalid) begin |
| if (reqfifo_rdata[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1))-:((3 + (top_pkg_TL_SZW + 7)) >= (1 + (top_pkg_TL_SZW + 8)) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1))) - (1 + (top_pkg_TL_SZW + top_pkg_TL_AIW))) + 1 : ((1 + (top_pkg_TL_SZW + top_pkg_TL_AIW)) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1)))) + 1)] == OpRead) |
| d_error = rspfifo_rdata[0] | reqfifo_rdata[1 + (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1))]; |
| else |
| d_error = reqfifo_rdata[1 + (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1))]; |
| end |
| else |
| d_error = 1'b0; |
| end |
| function automatic [0:0] sv2v_cast_1; |
| input reg [0:0] inp; |
| sv2v_cast_1 = inp; |
| endfunction |
| assign tl_o = {sv2v_cast_1(d_valid), sv2v_cast_3((d_valid && (reqfifo_rdata[3 + (top_pkg_TL_SZW + 7)-:((3 + (top_pkg_TL_SZW + 7)) >= (1 + (top_pkg_TL_SZW + 8)) ? ((3 + (top_pkg_TL_SZW + 7)) - (1 + (top_pkg_TL_SZW + 8))) + 1 : ((1 + (top_pkg_TL_SZW + 8)) - (3 + (top_pkg_TL_SZW + 7))) + 1)] != 1) ? AccessAck : AccessAckData)), 3'b000, sv2v_cast_F00AF((d_valid ? reqfifo_rdata[top_pkg_TL_SZW + (top_pkg_TL_AIW - 1)-:((top_pkg_TL_SZW + 7) >= 8 ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW - 1)) - top_pkg_TL_AIW) + 1 : (top_pkg_TL_AIW - (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1))) + 1)] : {((top_pkg_TL_SZW + 7) >= 8 ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW - 1)) - top_pkg_TL_AIW) + 1 : (top_pkg_TL_AIW - (top_pkg_TL_SZW + (top_pkg_TL_AIW - 1))) + 1) {1'sb0}})), sv2v_cast_F1F18((d_valid ? reqfifo_rdata[top_pkg_TL_AIW - 1-:top_pkg_TL_AIW] : {top_pkg_TL_AIW {1'sb0}})), sv2v_cast_B5AB2(1'b0), sv2v_cast_2497D(((d_valid && rspfifo_rvalid) && (reqfifo_rdata[3 + (top_pkg_TL_SZW + 7)-:((3 + (top_pkg_TL_SZW + 7)) >= (1 + (top_pkg_TL_SZW + 8)) ? ((3 + (top_pkg_TL_SZW + 7)) - (1 + (top_pkg_TL_SZW + 8))) + 1 : ((1 + (top_pkg_TL_SZW + 8)) - (3 + (top_pkg_TL_SZW + 7))) + 1)] == 1) ? rspfifo_rdata[SramDw-:(SramDw >= 1 ? SramDw : 2 - SramDw)] : {(SramDw >= 1 ? SramDw : 2 - SramDw) {1'sb0}})), sv2v_cast_92577(1'sb0), sv2v_cast_1(d_valid && d_error), sv2v_cast_1(((gnt_i | error_internal) & reqfifo_wready) & sramreqfifo_wready)}; |
| assign req_o = (tl_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] & reqfifo_wready) & ~error_internal; |
| assign we_o = tl_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] & sv2v_cast_1(|{tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == PutFullData, tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == PutPartialData}); |
| assign addr_o = (tl_i[7 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))] ? tl_i[(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - ((top_pkg_TL_AW - 1) - DataBitWidth)+:SramAw] : {SramAw {1'sb0}}); |
| wire [WoffsetWidth - 1:0] woffset; |
| generate |
| if (top_pkg_TL_DW != SramDw) begin : gen_wordwidthadapt |
| assign woffset = tl_i[(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - ((top_pkg_TL_AW - 1) - (DataBitWidth - 1)):(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - ((top_pkg_TL_AW - 1) - prim_util_pkg_vbits(top_pkg_TL_DBW))]; |
| end |
| else begin : gen_no_wordwidthadapt |
| assign woffset = {WoffsetWidth {1'sb0}}; |
| end |
| endgenerate |
| reg [(WidthMult * top_pkg_TL_DW) - 1:0] wmask_int; |
| reg [(WidthMult * top_pkg_TL_DW) - 1:0] wdata_int; |
| always @(*) begin |
| wmask_int = {WidthMult * top_pkg_TL_DW {1'sb0}}; |
| wdata_int = {WidthMult * top_pkg_TL_DW {1'sb0}}; |
| if (tl_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))]) begin : sv2v_autoblock_82 |
| reg signed [31:0] i; |
| for (i = 0; i < (top_pkg_TL_DW / 8); i = i + 1) |
| begin |
| wmask_int[(woffset * top_pkg_TL_DW) + (8 * i)+:8] = {8 {tl_i[(top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - ((top_pkg_TL_DBW - 1) - i)]}}; |
| wdata_int[(woffset * top_pkg_TL_DW) + (8 * i)+:8] = (tl_i[(top_pkg_TL_DBW + 48) - ((top_pkg_TL_DBW - 1) - i)] && we_o ? tl_i[(top_pkg_TL_DW + 16) - ((top_pkg_TL_DW - 1) - (8 * i))+:8] : {8 {1'sb0}}); |
| end |
| end |
| end |
| assign wmask_o = wmask_int; |
| assign wdata_o = wdata_int; |
| assign wr_attr_error = ((tl_i[6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) - (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))))) + 1 : ((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) - (6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))))) + 1)] == 3'h0) || (tl_i[6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) - (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))))) + 1 : ((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) - (6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))))) + 1)] == 3'h1) ? (ByteAccess == 0 ? (tl_i[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)] != {top_pkg_TL_DBW {1'sb1}}) || (tl_i[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)] != 2'h2) : 1'b0) : 1'b0); |
| generate |
| if (ErrOnWrite == 1) begin : gen_no_writes |
| assign wr_vld_error = tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] != Get; |
| end |
| else begin : gen_writes_allowed |
| assign wr_vld_error = 1'b0; |
| end |
| endgenerate |
| generate |
| if (ErrOnRead == 1) begin : gen_no_reads |
| assign rd_vld_error = tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == Get; |
| end |
| else begin : gen_reads_allowed |
| assign rd_vld_error = 1'b0; |
| end |
| endgenerate |
| tlul_err u_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(tl_i), |
| .err_o(tlul_error) |
| ); |
| assign error_internal = ((wr_attr_error | wr_vld_error) | rd_vld_error) | tlul_error; |
| assign reqfifo_wvalid = a_ack; |
| function automatic [1:0] sv2v_cast_2; |
| input reg [1:0] inp; |
| sv2v_cast_2 = inp; |
| endfunction |
| localparam [1:0] OpWrite = 0; |
| assign reqfifo_wdata = {sv2v_cast_2((tl_i[6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) - (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))))) + 1 : ((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) - (6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))))) + 1)] != 3'h4 ? OpWrite : OpRead)), sv2v_cast_1(error_internal), sv2v_cast_F00AF(tl_i[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)]), sv2v_cast_F1F18(tl_i[top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))-:((40 + (top_pkg_TL_DBW + 48)) >= (32 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) + 1 : ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + 1)])}; |
| assign reqfifo_rready = d_ack; |
| function automatic [WoffsetWidth - 1:0] sv2v_cast_4AB74; |
| input reg [WoffsetWidth - 1:0] inp; |
| sv2v_cast_4AB74 = inp; |
| endfunction |
| assign sramreqfifo_wdata = {sv2v_cast_37199(tl_i[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)]), sv2v_cast_4AB74(woffset)}; |
| assign sramreqfifo_wvalid = sram_ack & ~we_o; |
| assign sramreqfifo_rready = rspfifo_wvalid; |
| assign rspfifo_wvalid = rvalid_i & reqfifo_rvalid; |
| wire [(WidthMult * top_pkg_TL_DW) - 1:0] rdata; |
| reg [(WidthMult * top_pkg_TL_DW) - 1:0] rmask; |
| wire [top_pkg_TL_DW - 1:0] rdata_tlword; |
| always @(*) begin |
| rmask = {WidthMult * top_pkg_TL_DW {1'sb0}}; |
| begin : sv2v_autoblock_83 |
| reg signed [31:0] i; |
| for (i = 0; i < (top_pkg_TL_DW / 8); i = i + 1) |
| rmask[(sramreqfifo_rdata[WoffsetWidth - 1-:WoffsetWidth] * top_pkg_TL_DW) + (8 * i)+:8] = {8 {sramreqfifo_rdata[(top_pkg_TL_DBW + (WoffsetWidth - 1)) - ((top_pkg_TL_DBW - 1) - i)]}}; |
| end |
| end |
| assign rdata = rdata_i & rmask; |
| assign rdata_tlword = rdata[sramreqfifo_rdata[WoffsetWidth - 1-:WoffsetWidth] * top_pkg_TL_DW+:top_pkg_TL_DW]; |
| function automatic [SramDw - 1:0] sv2v_cast_D11AA; |
| input reg [SramDw - 1:0] inp; |
| sv2v_cast_D11AA = inp; |
| endfunction |
| assign rspfifo_wdata = {sv2v_cast_D11AA(rdata_tlword), sv2v_cast_1(rerror_i[1])}; |
| assign rspfifo_rready = ((reqfifo_rdata[3 + (top_pkg_TL_SZW + 7)-:((3 + (top_pkg_TL_SZW + 7)) >= (1 + (top_pkg_TL_SZW + 8)) ? ((3 + (top_pkg_TL_SZW + 7)) - (1 + (top_pkg_TL_SZW + 8))) + 1 : ((1 + (top_pkg_TL_SZW + 8)) - (3 + (top_pkg_TL_SZW + 7))) + 1)] == 1) & ~reqfifo_rdata[1 + (top_pkg_TL_SZW + 7)] ? reqfifo_rready : 1'b0); |
| wire unused_rerror; |
| assign unused_rerror = rerror_i[0]; |
| prim_fifo_sync #( |
| .Width(ReqFifoWidth), |
| .Pass(1'b0), |
| .Depth(Outstanding) |
| ) u_reqfifo( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .clr_i(1'b0), |
| .wvalid_i(reqfifo_wvalid), |
| .wready_o(reqfifo_wready), |
| .wdata_i(reqfifo_wdata), |
| .depth_o(), |
| .rvalid_o(reqfifo_rvalid), |
| .rready_i(reqfifo_rready), |
| .rdata_o(reqfifo_rdata) |
| ); |
| prim_fifo_sync #( |
| .Width(SramReqFifoWidth), |
| .Pass(1'b0), |
| .Depth(Outstanding) |
| ) u_sramreqfifo( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .clr_i(1'b0), |
| .wvalid_i(sramreqfifo_wvalid), |
| .wready_o(sramreqfifo_wready), |
| .wdata_i(sramreqfifo_wdata), |
| .depth_o(), |
| .rvalid_o(), |
| .rready_i(sramreqfifo_rready), |
| .rdata_o(sramreqfifo_rdata) |
| ); |
| prim_fifo_sync #( |
| .Width(RspFifoWidth), |
| .Pass(1'b1), |
| .Depth(Outstanding) |
| ) u_rspfifo( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .clr_i(1'b0), |
| .wvalid_i(rspfifo_wvalid), |
| .wready_o(rspfifo_wready), |
| .wdata_i(rspfifo_wdata), |
| .depth_o(), |
| .rvalid_o(rspfifo_rvalid), |
| .rready_i(rspfifo_rready), |
| .rdata_o(rspfifo_rdata) |
| ); |
| endmodule |
| module tlul_err ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| err_o |
| ); |
| localparam ArbiterImpl = "PPC"; |
| localparam [31:0] ADDR_SPACE_UART = 32'h40000000; |
| localparam [31:0] ADDR_SPACE_GPIO = 32'h40010000; |
| localparam [31:0] ADDR_SPACE_SRAMD = 32'h18000000; |
| localparam [31:0] ADDR_SPACE_SRAMI = 32'h00080000; |
| localparam [31:0] ADDR_SPACE_DEBUG_MEM = 32'h1a110000; |
| localparam [31:0] ADDR_SPACE_RV_PLIC = 32'h40090000; |
| localparam [31:0] ADDR_SPACE_SPI_DEVICE = 32'h40020000; |
| localparam [31:0] ADDR_SPACE_RV_TIMER = 32'h40080000; |
| localparam [31:0] ADDR_MASK_UART = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_GPIO = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SRAMD = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_SRAMI = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_DEBUG_MEM = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_PLIC = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SPI_DEVICE = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_TIMER = 32'h00000fff; |
| localparam [2:0] PutFullData = 3'h0; |
| localparam [2:0] PutPartialData = 3'h1; |
| localparam [2:0] Get = 3'h4; |
| localparam [2:0] AccessAck = 3'h0; |
| localparam [2:0] AccessAckData = 3'h1; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| function automatic [top_pkg_TL_SZW - 1:0] sv2v_cast_F00AF; |
| input reg [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_F00AF = inp; |
| endfunction |
| function automatic [top_pkg_TL_AIW - 1:0] sv2v_cast_F1F18; |
| input reg [top_pkg_TL_AIW - 1:0] inp; |
| sv2v_cast_F1F18 = inp; |
| endfunction |
| function automatic [top_pkg_TL_AW - 1:0] sv2v_cast_4CD75; |
| input reg [top_pkg_TL_AW - 1:0] inp; |
| sv2v_cast_4CD75 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DBW - 1:0] sv2v_cast_37199; |
| input reg [top_pkg_TL_DBW - 1:0] inp; |
| sv2v_cast_37199 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DW - 1:0] sv2v_cast_2497D; |
| input reg [top_pkg_TL_DW - 1:0] inp; |
| sv2v_cast_2497D = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] TL_H2D_DEFAULT = {1'sb0, 3'b000, 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_4CD75(1'sb0), sv2v_cast_37199(1'sb0), sv2v_cast_2497D(1'sb0), 16'b0000000000000000, 1'b1}; |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| function automatic [top_pkg_TL_DIW - 1:0] sv2v_cast_B5AB2; |
| input reg [top_pkg_TL_DIW - 1:0] inp; |
| sv2v_cast_B5AB2 = inp; |
| endfunction |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| function automatic [top_pkg_TL_DUW - 1:0] sv2v_cast_92577; |
| input reg [top_pkg_TL_DUW - 1:0] inp; |
| sv2v_cast_92577 = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] TL_D2H_DEFAULT = {1'sb0, sv2v_cast_3(3'b000), 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_B5AB2(1'sb0), sv2v_cast_2497D(1'sb0), sv2v_cast_92577(1'sb0), 1'sb0, 1'b1}; |
| input clk_i; |
| input rst_ni; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| output wire err_o; |
| localparam signed [31:0] IW = top_pkg_TL_AIW; |
| localparam signed [31:0] SZW = top_pkg_TL_SZW; |
| localparam signed [31:0] DW = top_pkg_TL_DW; |
| localparam signed [31:0] MW = top_pkg_TL_DBW; |
| localparam signed [31:0] SubAW = 2; |
| wire opcode_allowed; |
| wire a_config_allowed; |
| wire op_full; |
| wire op_partial; |
| wire op_get; |
| assign op_full = tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == PutFullData; |
| assign op_partial = tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == PutPartialData; |
| assign op_get = tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == Get; |
| assign err_o = ~(opcode_allowed & a_config_allowed); |
| assign opcode_allowed = ((tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == PutFullData) | (tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == PutPartialData)) | (tl_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] == Get); |
| reg addr_sz_chk; |
| reg mask_chk; |
| reg fulldata_chk; |
| wire [MW - 1:0] mask; |
| assign mask = 1 << tl_i[(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - ((top_pkg_TL_AW - 1) - (SubAW - 1)):(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_AW - 1)]; |
| always @(*) begin |
| addr_sz_chk = 1'b0; |
| mask_chk = 1'b0; |
| fulldata_chk = 1'b0; |
| if (tl_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))]) |
| case (tl_i[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)]) |
| 'h0: begin |
| addr_sz_chk = 1'b1; |
| mask_chk = ~|(tl_i[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)] & ~mask); |
| fulldata_chk = |(tl_i[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)] & mask); |
| end |
| 'h1: begin |
| addr_sz_chk = ~tl_i[(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_AW - 1)]; |
| mask_chk = (tl_i[(32 + (top_pkg_TL_DBW + 48)) - 30] ? ~|(tl_i[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)] & 4'b0011) : ~|(tl_i[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)] & 4'b1100)); |
| fulldata_chk = (tl_i[(32 + (top_pkg_TL_DBW + 48)) - 30] ? &tl_i[(top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DBW - 4):(top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DBW - 3)] : &tl_i[(top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DBW - 2):(top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DBW - 1)]); |
| end |
| 'h2: begin |
| addr_sz_chk = ~|tl_i[(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - ((top_pkg_TL_AW - 1) - (SubAW - 1)):(top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_AW - 1)]; |
| mask_chk = 1'b1; |
| fulldata_chk = &tl_i[(top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DBW - 4):(top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DBW - 1)]; |
| end |
| default: begin |
| addr_sz_chk = 1'b0; |
| mask_chk = 1'b0; |
| fulldata_chk = 1'b0; |
| end |
| endcase |
| else begin |
| addr_sz_chk = 1'b0; |
| mask_chk = 1'b0; |
| fulldata_chk = 1'b0; |
| end |
| end |
| assign a_config_allowed = (addr_sz_chk & mask_chk) & ((op_get | op_partial) | fulldata_chk); |
| endmodule |
| module tlul_err_resp ( |
| clk_i, |
| rst_ni, |
| tl_h_i, |
| tl_h_o |
| ); |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_h_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_h_o; |
| localparam ArbiterImpl = "PPC"; |
| localparam [31:0] ADDR_SPACE_UART = 32'h40000000; |
| localparam [31:0] ADDR_SPACE_GPIO = 32'h40010000; |
| localparam [31:0] ADDR_SPACE_SRAMD = 32'h18000000; |
| localparam [31:0] ADDR_SPACE_SRAMI = 32'h00080000; |
| localparam [31:0] ADDR_SPACE_DEBUG_MEM = 32'h1a110000; |
| localparam [31:0] ADDR_SPACE_RV_PLIC = 32'h40090000; |
| localparam [31:0] ADDR_SPACE_SPI_DEVICE = 32'h40020000; |
| localparam [31:0] ADDR_SPACE_RV_TIMER = 32'h40080000; |
| localparam [31:0] ADDR_MASK_UART = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_GPIO = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SRAMD = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_SRAMI = 32'h0000ffff; |
| localparam [31:0] ADDR_MASK_DEBUG_MEM = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_PLIC = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_SPI_DEVICE = 32'h00000fff; |
| localparam [31:0] ADDR_MASK_RV_TIMER = 32'h00000fff; |
| localparam [2:0] PutFullData = 3'h0; |
| localparam [2:0] PutPartialData = 3'h1; |
| localparam [2:0] Get = 3'h4; |
| localparam [2:0] AccessAck = 3'h0; |
| localparam [2:0] AccessAckData = 3'h1; |
| function automatic [top_pkg_TL_SZW - 1:0] sv2v_cast_F00AF; |
| input reg [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_F00AF = inp; |
| endfunction |
| function automatic [top_pkg_TL_AIW - 1:0] sv2v_cast_F1F18; |
| input reg [top_pkg_TL_AIW - 1:0] inp; |
| sv2v_cast_F1F18 = inp; |
| endfunction |
| function automatic [top_pkg_TL_AW - 1:0] sv2v_cast_4CD75; |
| input reg [top_pkg_TL_AW - 1:0] inp; |
| sv2v_cast_4CD75 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DBW - 1:0] sv2v_cast_37199; |
| input reg [top_pkg_TL_DBW - 1:0] inp; |
| sv2v_cast_37199 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DW - 1:0] sv2v_cast_2497D; |
| input reg [top_pkg_TL_DW - 1:0] inp; |
| sv2v_cast_2497D = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] TL_H2D_DEFAULT = {1'sb0, 3'b000, 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_4CD75(1'sb0), sv2v_cast_37199(1'sb0), sv2v_cast_2497D(1'sb0), 16'b0000000000000000, 1'b1}; |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DIW - 1:0] sv2v_cast_B5AB2; |
| input reg [top_pkg_TL_DIW - 1:0] inp; |
| sv2v_cast_B5AB2 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DUW - 1:0] sv2v_cast_92577; |
| input reg [top_pkg_TL_DUW - 1:0] inp; |
| sv2v_cast_92577 = inp; |
| endfunction |
| localparam [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] TL_D2H_DEFAULT = {1'sb0, sv2v_cast_3(3'b000), 3'b000, sv2v_cast_F00AF(1'sb0), sv2v_cast_F1F18(1'sb0), sv2v_cast_B5AB2(1'sb0), sv2v_cast_2497D(1'sb0), sv2v_cast_92577(1'sb0), 1'sb0, 1'b1}; |
| reg [2:0] err_opcode; |
| reg [top_pkg_TL_AIW - 1:0] err_source; |
| reg [top_pkg_TL_SZW - 1:0] err_size; |
| reg err_req_pending; |
| reg err_rsp_pending; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| err_req_pending <= 1'b0; |
| err_source <= {top_pkg_TL_AIW {1'b0}}; |
| err_opcode <= Get; |
| err_size <= {top_pkg_TL_SZW {1'sb0}}; |
| end |
| else if (tl_h_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] && tl_h_o[0]) begin |
| err_req_pending <= 1'b1; |
| err_source <= tl_h_i[top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))-:((40 + (top_pkg_TL_DBW + 48)) >= (32 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) + 1 : ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + 1)]; |
| err_opcode <= tl_h_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)]; |
| err_size <= tl_h_i[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)]; |
| end |
| else if (!err_rsp_pending) |
| err_req_pending <= 1'b0; |
| assign tl_h_o[0] = ~err_rsp_pending & ~(err_req_pending & ~tl_h_i[0]); |
| assign tl_h_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))] = err_req_pending | err_rsp_pending; |
| assign tl_h_o[top_pkg_TL_DW + (top_pkg_TL_DUW + 1)-:((top_pkg_TL_DW + (top_pkg_TL_DUW + 1)) - (top_pkg_TL_DUW + 2)) + 1] = {((top_pkg_TL_DW + (top_pkg_TL_DUW + 1)) - (((top_pkg_TL_DW + (top_pkg_TL_DUW + 1)) - (((top_pkg_TL_DW + (top_pkg_TL_DUW + 1)) - (top_pkg_TL_DUW + 2)) + 1)) + 1)) + 1 {1'sb1}}; |
| assign tl_h_o[top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))-:((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))) - (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) + 1] = err_source; |
| assign tl_h_o[top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))-:((top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))) - (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))) + 1] = {((top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))) - (((top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))) - (((top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))) - (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))) + 1)) + 1)) + 1 {1'sb0}}; |
| assign tl_h_o[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((3 + (top_pkg_TL_SZW + 58)) >= (top_pkg_TL_SZW + 59) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)] = {((3 + (top_pkg_TL_SZW + 58)) >= (((3 + (top_pkg_TL_SZW + 58)) - ((3 + (top_pkg_TL_SZW + 58)) >= (top_pkg_TL_SZW + 59) ? ((3 + (top_pkg_TL_SZW + 58)) - (top_pkg_TL_SZW + 59)) + 1 : ((top_pkg_TL_SZW + 59) - (3 + (top_pkg_TL_SZW + 58))) + 1)) + 1) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - ((3 + (top_pkg_TL_SZW + 58)) >= (top_pkg_TL_SZW + 59) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)) + 1)) + 1 : ((((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - ((3 + (top_pkg_TL_SZW + 58)) >= (top_pkg_TL_SZW + 59) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)) + 1) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1) {1'sb0}}; |
| assign tl_h_o[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))-:((top_pkg_TL_SZW + 58) >= 59 ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))) - (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) + 1)] = err_size; |
| assign tl_h_o[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((6 + (top_pkg_TL_SZW + 58)) >= (3 + (top_pkg_TL_SZW + 59)) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)] = (err_opcode == Get ? AccessAckData : AccessAck); |
| assign tl_h_o[top_pkg_TL_DUW + 1-:top_pkg_TL_DUW] = {((top_pkg_TL_DUW + 1) - (((top_pkg_TL_DUW + 1) - top_pkg_TL_DUW) + 1)) + 1 {1'sb0}}; |
| assign tl_h_o[1] = 1'b1; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| err_rsp_pending <= 1'b0; |
| else if ((err_req_pending || err_rsp_pending) && !tl_h_i[0]) |
| err_rsp_pending <= 1'b1; |
| else |
| err_rsp_pending <= 1'b0; |
| endmodule |
| module tlul_fifo_sync ( |
| clk_i, |
| rst_ni, |
| tl_h_i, |
| tl_h_o, |
| tl_d_o, |
| tl_d_i, |
| spare_req_i, |
| spare_req_o, |
| spare_rsp_i, |
| spare_rsp_o |
| ); |
| parameter [31:0] ReqPass = 1'b1; |
| parameter [31:0] RspPass = 1'b1; |
| parameter [31:0] ReqDepth = 2; |
| parameter [31:0] RspDepth = 2; |
| parameter [31:0] SpareReqW = 1; |
| parameter [31:0] SpareRspW = 1; |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_h_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_h_o; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_d_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_d_i; |
| input [SpareReqW - 1:0] spare_req_i; |
| output [SpareReqW - 1:0] spare_req_o; |
| input [SpareRspW - 1:0] spare_rsp_i; |
| output [SpareRspW - 1:0] spare_rsp_o; |
| localparam [31:0] REQFIFO_WIDTH = ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15) + SpareReqW; |
| prim_fifo_sync #( |
| .Width(REQFIFO_WIDTH), |
| .Pass(ReqPass), |
| .Depth(ReqDepth) |
| ) reqfifo( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .clr_i(1'b0), |
| .wvalid_i(tl_h_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))]), |
| .wready_o(tl_h_o[0]), |
| .wdata_i({tl_h_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)], tl_h_i[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)], tl_h_i[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)], tl_h_i[top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))-:((40 + (top_pkg_TL_DBW + 48)) >= (32 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) + 1 : ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + 1)], tl_h_i[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)], tl_h_i[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)], tl_h_i[top_pkg_TL_DW + 16-:top_pkg_TL_DW], tl_h_i[16-:16], spare_req_i}), |
| .depth_o(), |
| .rvalid_o(tl_d_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))]), |
| .rready_i(tl_d_i[0]), |
| .rdata_o({tl_d_o[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)], tl_d_o[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)], tl_d_o[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)], tl_d_o[top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))-:((40 + (top_pkg_TL_DBW + 48)) >= (32 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) + 1 : ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + 1)], tl_d_o[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)], tl_d_o[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)], tl_d_o[top_pkg_TL_DW + 16-:top_pkg_TL_DW], tl_d_o[16-:16], spare_req_o}) |
| ); |
| localparam [31:0] RSPFIFO_WIDTH = ((((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)) - 2) + SpareRspW; |
| localparam [2:0] tlul_pkg_AccessAckData = 3'h1; |
| prim_fifo_sync #( |
| .Width(RSPFIFO_WIDTH), |
| .Pass(RspPass), |
| .Depth(RspDepth) |
| ) rspfifo( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .clr_i(1'b0), |
| .wvalid_i(tl_d_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))]), |
| .wready_o(tl_d_o[0]), |
| .wdata_i({tl_d_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((6 + (top_pkg_TL_SZW + 58)) >= (3 + (top_pkg_TL_SZW + 59)) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)], tl_d_i[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((3 + (top_pkg_TL_SZW + 58)) >= (top_pkg_TL_SZW + 59) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)], tl_d_i[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))-:((top_pkg_TL_SZW + 58) >= 59 ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))) - (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) + 1)], tl_d_i[top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))-:((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))) - (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) + 1], tl_d_i[top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))-:((top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))) - (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))) + 1], (tl_d_i[6 + (top_pkg_TL_SZW + 58)-:((6 + (top_pkg_TL_SZW + 58)) >= (3 + (top_pkg_TL_SZW + 59)) ? ((6 + (top_pkg_TL_SZW + 58)) - (3 + (top_pkg_TL_SZW + 59))) + 1 : ((3 + (top_pkg_TL_SZW + 59)) - (6 + (top_pkg_TL_SZW + 58))) + 1)] == 3'h1 ? tl_d_i[top_pkg_TL_DW + (top_pkg_TL_DUW + 1)-:((top_pkg_TL_DW + (top_pkg_TL_DUW + 1)) - (top_pkg_TL_DUW + 2)) + 1] : {top_pkg_TL_DW {1'b0}}), tl_d_i[top_pkg_TL_DUW + 1-:top_pkg_TL_DUW], tl_d_i[1], spare_rsp_i}), |
| .depth_o(), |
| .rvalid_o(tl_h_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))]), |
| .rready_i(tl_h_i[0]), |
| .rdata_o({tl_h_o[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((6 + (top_pkg_TL_SZW + 58)) >= (3 + (top_pkg_TL_SZW + 59)) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)], tl_h_o[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((3 + (top_pkg_TL_SZW + 58)) >= (top_pkg_TL_SZW + 59) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)], tl_h_o[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))-:((top_pkg_TL_SZW + 58) >= 59 ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))) - (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) + 1)], tl_h_o[top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))-:((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))) - (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) + 1], tl_h_o[top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))-:((top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))) - (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))) + 1], tl_h_o[top_pkg_TL_DW + (top_pkg_TL_DUW + 1)-:((top_pkg_TL_DW + (top_pkg_TL_DUW + 1)) - (top_pkg_TL_DUW + 2)) + 1], tl_h_o[top_pkg_TL_DUW + 1-:top_pkg_TL_DUW], tl_h_o[1], spare_rsp_o}) |
| ); |
| endmodule |
| module tlul_socket_1n ( |
| clk_i, |
| rst_ni, |
| tl_h_i, |
| tl_h_o, |
| tl_d_o, |
| tl_d_i, |
| dev_select_i |
| ); |
| parameter [31:0] N = 4; |
| parameter [0:0] HReqPass = 1'b1; |
| parameter [0:0] HRspPass = 1'b1; |
| parameter [N - 1:0] DReqPass = {N {1'b1}}; |
| parameter [N - 1:0] DRspPass = {N {1'b1}}; |
| parameter [3:0] HReqDepth = 4'h2; |
| parameter [3:0] HRspDepth = 4'h2; |
| parameter [(N * 4) - 1:0] DReqDepth = {N {4'h2}}; |
| parameter [(N * 4) - 1:0] DRspDepth = {N {4'h2}}; |
| localparam [31:0] NWD = $clog2(N + 1); |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_h_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_h_o; |
| output wire [(0 >= (N - 1) ? (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((2 - N) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) + (((N - 1) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1) : ((2 - N) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + ((N - 1) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))) - 1)) : (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (N * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (N * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15))):(0 >= (N - 1) ? (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (N - 1) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + ((N - 1) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))) : (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] tl_d_o; |
| input wire [(0 >= (N - 1) ? (((7 + top_pkg_TL_SZW) + 58) >= 0 ? ((2 - N) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) + (((N - 1) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1) : ((2 - N) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + ((((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + ((N - 1) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))) - 1)) : (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (N * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (N * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW))):(0 >= (N - 1) ? (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (N - 1) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + ((N - 1) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))) : (((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] tl_d_i; |
| input [NWD - 1:0] dev_select_i; |
| wire [NWD - 1:0] dev_select_t; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_t_o; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_t_i; |
| tlul_fifo_sync #( |
| .ReqPass(HReqPass), |
| .RspPass(HRspPass), |
| .ReqDepth(HReqDepth), |
| .RspDepth(HRspDepth), |
| .SpareReqW(NWD) |
| ) fifo_h( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_h_i), |
| .tl_h_o(tl_h_o), |
| .tl_d_o(tl_t_o), |
| .tl_d_i(tl_t_i), |
| .spare_req_i(dev_select_i), |
| .spare_req_o(dev_select_t), |
| .spare_rsp_i(1'b0), |
| .spare_rsp_o() |
| ); |
| reg [7:0] num_req_outstanding; |
| reg [NWD - 1:0] dev_select_outstanding; |
| wire hold_all_requests; |
| wire accept_t_req; |
| wire accept_t_rsp; |
| assign accept_t_req = tl_t_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] & tl_t_i[0]; |
| assign accept_t_rsp = tl_t_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))] & tl_t_o[0]; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| num_req_outstanding <= 8'h00; |
| dev_select_outstanding <= {NWD {1'sb0}}; |
| end |
| else if (accept_t_req) begin |
| if (!accept_t_rsp) |
| num_req_outstanding <= num_req_outstanding + 8'h01; |
| dev_select_outstanding <= dev_select_t; |
| end |
| else if (accept_t_rsp) |
| num_req_outstanding <= num_req_outstanding - 8'h01; |
| assign hold_all_requests = (num_req_outstanding != 8'h00) & (dev_select_t != dev_select_outstanding); |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_u_o [0:N]; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_u_i [0:N]; |
| generate |
| genvar i; |
| for (i = 0; i < N; i = i + 1) begin : gen_u_o |
| function automatic signed [NWD - 1:0] sv2v_cast_3B809_signed; |
| input reg signed [NWD - 1:0] inp; |
| sv2v_cast_3B809_signed = inp; |
| endfunction |
| assign tl_u_o[i][7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] = (tl_t_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] & (dev_select_t == sv2v_cast_3B809_signed(i))) & ~hold_all_requests; |
| assign tl_u_o[i][6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] = tl_t_o[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)]; |
| assign tl_u_o[i][3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] = tl_t_o[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)]; |
| assign tl_u_o[i][top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)] = tl_t_o[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)]; |
| assign tl_u_o[i][top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))-:((40 + (top_pkg_TL_DBW + 48)) >= (32 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) + 1 : ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + 1)] = tl_t_o[top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))-:((40 + (top_pkg_TL_DBW + 48)) >= (32 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) + 1 : ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + 1)]; |
| assign tl_u_o[i][top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] = tl_t_o[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)]; |
| assign tl_u_o[i][top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)] = tl_t_o[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)]; |
| assign tl_u_o[i][top_pkg_TL_DW + 16-:top_pkg_TL_DW] = tl_t_o[top_pkg_TL_DW + 16-:top_pkg_TL_DW]; |
| assign tl_u_o[i][16-:16] = tl_t_o[16-:16]; |
| end |
| endgenerate |
| reg [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_t_p; |
| reg hfifo_reqready; |
| function automatic signed [NWD - 1:0] sv2v_cast_3B809_signed; |
| input reg signed [NWD - 1:0] inp; |
| sv2v_cast_3B809_signed = inp; |
| endfunction |
| always @(*) begin |
| hfifo_reqready = tl_u_i[N][0]; |
| begin : sv2v_autoblock_84 |
| reg signed [31:0] idx; |
| for (idx = 0; idx < N; idx = idx + 1) |
| if (dev_select_t == sv2v_cast_3B809_signed(idx)) |
| hfifo_reqready = tl_u_i[idx][0]; |
| end |
| if (hold_all_requests) |
| hfifo_reqready = 1'b0; |
| end |
| assign tl_t_i[0] = tl_t_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] & hfifo_reqready; |
| always @(*) begin |
| tl_t_p = tl_u_i[N]; |
| begin : sv2v_autoblock_85 |
| reg signed [31:0] idx; |
| for (idx = 0; idx < N; idx = idx + 1) |
| if (dev_select_outstanding == sv2v_cast_3B809_signed(idx)) |
| tl_t_p = tl_u_i[idx]; |
| end |
| end |
| assign tl_t_i[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))] = tl_t_p[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))]; |
| assign tl_t_i[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((6 + (top_pkg_TL_SZW + 58)) >= (3 + (top_pkg_TL_SZW + 59)) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)] = tl_t_p[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((6 + (top_pkg_TL_SZW + 58)) >= (3 + (top_pkg_TL_SZW + 59)) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)]; |
| assign tl_t_i[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((3 + (top_pkg_TL_SZW + 58)) >= (top_pkg_TL_SZW + 59) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)] = tl_t_p[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((3 + (top_pkg_TL_SZW + 58)) >= (top_pkg_TL_SZW + 59) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)]; |
| assign tl_t_i[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))-:((top_pkg_TL_SZW + 58) >= 59 ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))) - (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) + 1)] = tl_t_p[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))-:((top_pkg_TL_SZW + 58) >= 59 ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))) - (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) + 1)]; |
| assign tl_t_i[top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))-:((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))) - (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) + 1] = tl_t_p[top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))-:((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))) - (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) + 1]; |
| assign tl_t_i[top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))-:((top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))) - (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))) + 1] = tl_t_p[top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))-:((top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))) - (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))) + 1]; |
| assign tl_t_i[top_pkg_TL_DW + (top_pkg_TL_DUW + 1)-:((top_pkg_TL_DW + (top_pkg_TL_DUW + 1)) - (top_pkg_TL_DUW + 2)) + 1] = tl_t_p[top_pkg_TL_DW + (top_pkg_TL_DUW + 1)-:((top_pkg_TL_DW + (top_pkg_TL_DUW + 1)) - (top_pkg_TL_DUW + 2)) + 1]; |
| assign tl_t_i[top_pkg_TL_DUW + 1-:top_pkg_TL_DUW] = tl_t_p[top_pkg_TL_DUW + 1-:top_pkg_TL_DUW]; |
| assign tl_t_i[1] = tl_t_p[1]; |
| generate |
| for (i = 0; i < (N + 1); i = i + 1) begin : gen_u_o_d_ready |
| assign tl_u_o[i][0] = tl_t_o[0]; |
| end |
| endgenerate |
| generate |
| for (i = 0; i < N; i = i + 1) begin : gen_dfifo |
| tlul_fifo_sync #( |
| .ReqPass(DReqPass[i]), |
| .RspPass(DRspPass[i]), |
| .ReqDepth(DReqDepth[i * 4+:4]), |
| .RspDepth(DRspDepth[i * 4+:4]) |
| ) fifo_d( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_u_o[i]), |
| .tl_h_o(tl_u_i[i]), |
| .tl_d_o(tl_d_o[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + ((0 >= (N - 1) ? i : (N - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]), |
| .tl_d_i(tl_d_i[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + ((0 >= (N - 1) ? i : (N - 1) - i) * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]), |
| .spare_req_i(1'b0), |
| .spare_req_o(), |
| .spare_rsp_i(1'b0), |
| .spare_rsp_o() |
| ); |
| end |
| endgenerate |
| function automatic [NWD - 1:0] sv2v_cast_3B809_unsigned; |
| input reg [NWD - 1:0] inp; |
| sv2v_cast_3B809_unsigned = inp; |
| endfunction |
| assign tl_u_o[N][7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] = (tl_t_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))] & (dev_select_t == sv2v_cast_3B809_unsigned(N))) & ~hold_all_requests; |
| assign tl_u_o[N][6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] = tl_t_o[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)]; |
| assign tl_u_o[N][3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)] = tl_t_o[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)]; |
| assign tl_u_o[N][top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)] = tl_t_o[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)]; |
| assign tl_u_o[N][top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))-:((40 + (top_pkg_TL_DBW + 48)) >= (32 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) + 1 : ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + 1)] = tl_t_o[top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))-:((40 + (top_pkg_TL_DBW + 48)) >= (32 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) + 1 : ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + 1)]; |
| assign tl_u_o[N][top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)] = tl_t_o[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)]; |
| assign tl_u_o[N][top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)] = tl_t_o[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)]; |
| assign tl_u_o[N][top_pkg_TL_DW + 16-:top_pkg_TL_DW] = tl_t_o[top_pkg_TL_DW + 16-:top_pkg_TL_DW]; |
| assign tl_u_o[N][16-:16] = tl_t_o[16-:16]; |
| tlul_err_resp err_resp( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(tl_u_o[N]), |
| .tl_h_o(tl_u_i[N]) |
| ); |
| endmodule |
| module tlul_socket_m1 ( |
| clk_i, |
| rst_ni, |
| tl_h_i, |
| tl_h_o, |
| tl_d_o, |
| tl_d_i |
| ); |
| parameter [31:0] M = 4; |
| parameter [M - 1:0] HReqPass = {M {1'b1}}; |
| parameter [M - 1:0] HRspPass = {M {1'b1}}; |
| parameter [(M * 4) - 1:0] HReqDepth = {M {4'h2}}; |
| parameter [(M * 4) - 1:0] HRspDepth = {M {4'h2}}; |
| parameter [0:0] DReqPass = 1'b1; |
| parameter [0:0] DRspPass = 1'b1; |
| parameter [3:0] DReqDepth = 4'h2; |
| parameter [3:0] DRspDepth = 4'h2; |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(0 >= (M - 1) ? (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((2 - M) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) + (((M - 1) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1) : ((2 - M) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + ((M - 1) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))) - 1)) : (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (M * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (M * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15))):(0 >= (M - 1) ? (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (M - 1) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + ((M - 1) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))) : (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] tl_h_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(0 >= (M - 1) ? (((7 + top_pkg_TL_SZW) + 58) >= 0 ? ((2 - M) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) + (((M - 1) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1) : ((2 - M) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + ((((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + ((M - 1) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))) - 1)) : (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (M * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2)) - 1 : (M * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))) + (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW))):(0 >= (M - 1) ? (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (M - 1) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + ((M - 1) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))) : (((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))] tl_h_o; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_d_o; |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_d_i; |
| localparam [31:0] IDW = top_pkg_TL_AIW; |
| localparam [31:0] STIDW = $clog2(M); |
| wire [(0 >= (M - 1) ? (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((2 - M) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) + (((M - 1) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1) : ((2 - M) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + ((M - 1) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))) - 1)) : (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (M * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17)) - 1 : (M * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 15))):(0 >= (M - 1) ? (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (M - 1) * ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + ((M - 1) * (1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))) : (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))] hreq_fifo_o; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] hrsp_fifo_i [0:M - 1]; |
| wire [M - 1:0] hrequest; |
| wire [M - 1:0] hgrant; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] dreq_fifo_i; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] drsp_fifo_o; |
| wire arb_valid; |
| wire arb_ready; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] arb_data; |
| generate |
| genvar i; |
| for (i = 0; i < M; i = i + 1) begin : gen_host_fifo |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] hreq_fifo_i; |
| wire [STIDW - 1:0] reqid_sub; |
| wire [IDW - 1:0] shifted_id; |
| assign reqid_sub = i; |
| assign shifted_id = {tl_h_i[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AIW - 1) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AIW - 1))) : ((((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AIW - 1) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AIW - 1)))) - (IDW - STIDW)) + 1)+:IDW - STIDW], reqid_sub}; |
| wire [IDW - 1:IDW - STIDW] unused_tl_h_source; |
| assign unused_tl_h_source = tl_h_i[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - ((top_pkg_TL_AIW - 1) - (IDW - 1)) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - ((top_pkg_TL_AIW - 1) - (IDW - 1)))) : ((((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - ((top_pkg_TL_AIW - 1) - (IDW - 1)) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - ((top_pkg_TL_AIW - 1) - (IDW - 1))))) + STIDW) - 1)-:STIDW]; |
| function automatic [0:0] sv2v_cast_1; |
| input reg [0:0] inp; |
| sv2v_cast_1 = inp; |
| endfunction |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| function automatic [top_pkg_TL_SZW - 1:0] sv2v_cast_F00AF; |
| input reg [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_F00AF = inp; |
| endfunction |
| function automatic [top_pkg_TL_AIW - 1:0] sv2v_cast_F1F18; |
| input reg [top_pkg_TL_AIW - 1:0] inp; |
| sv2v_cast_F1F18 = inp; |
| endfunction |
| function automatic [top_pkg_TL_AW - 1:0] sv2v_cast_4CD75; |
| input reg [top_pkg_TL_AW - 1:0] inp; |
| sv2v_cast_4CD75 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DBW - 1:0] sv2v_cast_37199; |
| input reg [top_pkg_TL_DBW - 1:0] inp; |
| sv2v_cast_37199 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DW - 1:0] sv2v_cast_2497D; |
| input reg [top_pkg_TL_DW - 1:0] inp; |
| sv2v_cast_2497D = inp; |
| endfunction |
| function automatic [15:0] sv2v_cast_16; |
| input reg [15:0] inp; |
| sv2v_cast_16 = inp; |
| endfunction |
| assign hreq_fifo_i = {sv2v_cast_1(tl_h_i[((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))))]), sv2v_cast_3(tl_h_i[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) : ((((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))))) + ((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)) - 1)-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)]), sv2v_cast_3(tl_h_i[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) : ((((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))))) + ((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)) - 1)-:((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)]), sv2v_cast_F00AF(tl_h_i[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) : ((((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + ((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)) - 1)-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)]), sv2v_cast_F1F18(shifted_id), sv2v_cast_4CD75(tl_h_i[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) : ((((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + ((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)) - 1)-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)]), sv2v_cast_37199(tl_h_i[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? top_pkg_TL_DBW + (top_pkg_TL_DW + 16) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) : ((((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? top_pkg_TL_DBW + (top_pkg_TL_DW + 16) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + ((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)) - 1)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)]), sv2v_cast_2497D(tl_h_i[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? top_pkg_TL_DW + 16 : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (top_pkg_TL_DW + 16)) : ((((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? top_pkg_TL_DW + 16 : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (top_pkg_TL_DW + 16))) + top_pkg_TL_DW) - 1)-:top_pkg_TL_DW]), sv2v_cast_16(tl_h_i[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? ((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 16 : ((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) : (((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 16 : ((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW)) + 15)-:16]), sv2v_cast_1(tl_h_i[((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)])}; |
| tlul_fifo_sync #( |
| .ReqPass(HReqPass[i]), |
| .RspPass(HRspPass[i]), |
| .ReqDepth(HReqDepth[i * 4+:4]), |
| .RspDepth(HRspDepth[i * 4+:4]), |
| .SpareReqW(1) |
| ) u_hostfifo( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(hreq_fifo_i), |
| .tl_h_o(tl_h_o[(((7 + top_pkg_TL_SZW) + 58) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1) + ((0 >= (M - 1) ? i : (M - 1) - i) * (((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1)))+:(((7 + top_pkg_TL_SZW) + 58) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 2 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1))]), |
| .tl_d_o(hreq_fifo_o[(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) + ((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)))+:(((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))]), |
| .tl_d_i(hrsp_fifo_i[i]), |
| .spare_req_i(1'b0), |
| .spare_req_o(), |
| .spare_rsp_i(1'b0), |
| .spare_rsp_o() |
| ); |
| end |
| endgenerate |
| tlul_fifo_sync #( |
| .ReqPass(DReqPass), |
| .RspPass(DRspPass), |
| .ReqDepth(DReqDepth), |
| .RspDepth(DRspDepth), |
| .SpareReqW(1) |
| ) u_devicefifo( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_h_i(dreq_fifo_i), |
| .tl_h_o(drsp_fifo_o), |
| .tl_d_o(tl_d_o), |
| .tl_d_i(tl_d_i), |
| .spare_req_i(1'b0), |
| .spare_req_o(), |
| .spare_rsp_i(1'b0), |
| .spare_rsp_o() |
| ); |
| generate |
| for (i = 0; i < M; i = i + 1) begin : gen_arbreqgnt |
| assign hrequest[i] = hreq_fifo_o[((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) : ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16) - (7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))))]; |
| end |
| endgenerate |
| assign arb_ready = drsp_fifo_o[0]; |
| localparam tlul_pkg_ArbiterImpl = "PPC"; |
| generate |
| if (tlul_pkg_ArbiterImpl == "PPC") begin : gen_arb_ppc |
| prim_arbiter_ppc #( |
| .N(M), |
| .DW((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17), |
| .EnReqStabA(0) |
| ) u_reqarb( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .req_i(hrequest), |
| .data_i(hreq_fifo_o), |
| .gnt_o(hgrant), |
| .idx_o(), |
| .valid_o(arb_valid), |
| .data_o(arb_data), |
| .ready_i(arb_ready) |
| ); |
| end |
| else if (tlul_pkg_ArbiterImpl == "BINTREE") begin : gen_tree_arb |
| prim_arbiter_tree #( |
| .N(M), |
| .DW((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17), |
| .EnReqStabA(0) |
| ) u_reqarb( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .req_i(hrequest), |
| .data_i(hreq_fifo_o), |
| .gnt_o(hgrant), |
| .idx_o(), |
| .valid_o(arb_valid), |
| .data_o(arb_data), |
| .ready_i(arb_ready) |
| ); |
| end |
| endgenerate |
| wire [M - 1:0] hfifo_rspvalid; |
| wire [M - 1:0] dfifo_rspready; |
| wire [IDW - 1:0] hfifo_rspid; |
| wire dfifo_rspready_merged; |
| assign dfifo_rspready_merged = |dfifo_rspready; |
| function automatic [0:0] sv2v_cast_1; |
| input reg [0:0] inp; |
| sv2v_cast_1 = inp; |
| endfunction |
| function automatic [2:0] sv2v_cast_3; |
| input reg [2:0] inp; |
| sv2v_cast_3 = inp; |
| endfunction |
| function automatic [top_pkg_TL_SZW - 1:0] sv2v_cast_F00AF; |
| input reg [top_pkg_TL_SZW - 1:0] inp; |
| sv2v_cast_F00AF = inp; |
| endfunction |
| function automatic [top_pkg_TL_AIW - 1:0] sv2v_cast_F1F18; |
| input reg [top_pkg_TL_AIW - 1:0] inp; |
| sv2v_cast_F1F18 = inp; |
| endfunction |
| function automatic [top_pkg_TL_AW - 1:0] sv2v_cast_4CD75; |
| input reg [top_pkg_TL_AW - 1:0] inp; |
| sv2v_cast_4CD75 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DBW - 1:0] sv2v_cast_37199; |
| input reg [top_pkg_TL_DBW - 1:0] inp; |
| sv2v_cast_37199 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DW - 1:0] sv2v_cast_2497D; |
| input reg [top_pkg_TL_DW - 1:0] inp; |
| sv2v_cast_2497D = inp; |
| endfunction |
| function automatic [15:0] sv2v_cast_16; |
| input reg [15:0] inp; |
| sv2v_cast_16 = inp; |
| endfunction |
| assign dreq_fifo_i = {sv2v_cast_1(arb_valid), sv2v_cast_3(arb_data[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((6 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49)))) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)]), sv2v_cast_3(arb_data[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))-:((3 + (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48)))) >= (top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 49))) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))))) + 1)]), sv2v_cast_F00AF(arb_data[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))-:((top_pkg_TL_SZW + (40 + (top_pkg_TL_DBW + 48))) >= (40 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))))) + 1)]), sv2v_cast_F1F18(arb_data[top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))-:((40 + (top_pkg_TL_DBW + 48)) >= (32 + (top_pkg_TL_DBW + 49)) ? ((top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17)))) + 1 : ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) - (top_pkg_TL_AIW + (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))))) + 1)]), sv2v_cast_4CD75(arb_data[top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))-:((32 + (top_pkg_TL_DBW + 48)) >= (top_pkg_TL_DBW + 49) ? ((top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 17))) + 1 : ((top_pkg_TL_DBW + (top_pkg_TL_DW + 17)) - (top_pkg_TL_AW + (top_pkg_TL_DBW + (top_pkg_TL_DW + 16)))) + 1)]), sv2v_cast_37199(arb_data[top_pkg_TL_DBW + (top_pkg_TL_DW + 16)-:((top_pkg_TL_DBW + 48) >= 49 ? ((top_pkg_TL_DBW + (top_pkg_TL_DW + 16)) - (top_pkg_TL_DW + 17)) + 1 : ((top_pkg_TL_DW + 17) - (top_pkg_TL_DBW + (top_pkg_TL_DW + 16))) + 1)]), sv2v_cast_2497D(arb_data[top_pkg_TL_DW + 16-:top_pkg_TL_DW]), sv2v_cast_16(arb_data[16-:16]), sv2v_cast_1(dfifo_rspready_merged)}; |
| assign hfifo_rspid = {{STIDW {1'b0}}, drsp_fifo_o[(top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))) - ((top_pkg_TL_AIW - 1) - (IDW - 1)):(top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))) - ((top_pkg_TL_AIW - 1) - STIDW)]}; |
| generate |
| for (i = 0; i < M; i = i + 1) begin : gen_idrouting |
| assign hfifo_rspvalid[i] = drsp_fifo_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))] & (drsp_fifo_o[(top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))) - (top_pkg_TL_AIW - 1)+:STIDW] == i); |
| assign dfifo_rspready[i] = (hreq_fifo_o[((0 >= (M - 1) ? i : (M - 1) - i) * (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 17 : 1 - ((((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16))) + (((((7 + top_pkg_TL_SZW) + 40) + top_pkg_TL_DBW) + 48) >= 0 ? 0 : (((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16)] & (drsp_fifo_o[(top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))) - (top_pkg_TL_AIW - 1)+:STIDW] == i)) & drsp_fifo_o[7 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))]; |
| function automatic [top_pkg_TL_DIW - 1:0] sv2v_cast_B5AB2; |
| input reg [top_pkg_TL_DIW - 1:0] inp; |
| sv2v_cast_B5AB2 = inp; |
| endfunction |
| function automatic [top_pkg_TL_DUW - 1:0] sv2v_cast_92577; |
| input reg [top_pkg_TL_DUW - 1:0] inp; |
| sv2v_cast_92577 = inp; |
| endfunction |
| assign hrsp_fifo_i[i] = {sv2v_cast_1(hfifo_rspvalid[i]), sv2v_cast_3(drsp_fifo_o[6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((6 + (top_pkg_TL_SZW + 58)) >= (3 + (top_pkg_TL_SZW + 59)) ? ((6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))))) + 1 : ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) - (6 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)]), sv2v_cast_3(drsp_fifo_o[3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))-:((3 + (top_pkg_TL_SZW + 58)) >= (top_pkg_TL_SZW + 59) ? ((3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))))) + 1 : ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) - (3 + (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))))) + 1)]), sv2v_cast_F00AF(drsp_fifo_o[top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))-:((top_pkg_TL_SZW + 58) >= 59 ? ((top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))))) - (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))))) + 1 : ((top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 2)))) - (top_pkg_TL_SZW + (top_pkg_TL_AIW + (top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1)))))) + 1)]), sv2v_cast_F1F18(hfifo_rspid), sv2v_cast_B5AB2(drsp_fifo_o[top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))-:((top_pkg_TL_DIW + (top_pkg_TL_DW + (top_pkg_TL_DUW + 1))) - (top_pkg_TL_DW + (top_pkg_TL_DUW + 2))) + 1]), sv2v_cast_2497D(drsp_fifo_o[top_pkg_TL_DW + (top_pkg_TL_DUW + 1)-:((top_pkg_TL_DW + (top_pkg_TL_DUW + 1)) - (top_pkg_TL_DUW + 2)) + 1]), sv2v_cast_92577(drsp_fifo_o[top_pkg_TL_DUW + 1-:top_pkg_TL_DUW]), sv2v_cast_1(drsp_fifo_o[1]), sv2v_cast_1(hgrant[i])}; |
| end |
| endgenerate |
| endmodule |
| module uart ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| tl_o, |
| cio_rx_i, |
| cio_tx_o, |
| cio_tx_en_o, |
| intr_tx_watermark_o, |
| intr_rx_watermark_o, |
| intr_tx_empty_o, |
| intr_rx_overflow_o, |
| intr_rx_frame_err_o, |
| intr_rx_break_err_o, |
| intr_rx_timeout_o, |
| intr_rx_parity_err_o |
| ); |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_o; |
| input cio_rx_i; |
| output wire cio_tx_o; |
| output wire cio_tx_en_o; |
| output wire intr_tx_watermark_o; |
| output wire intr_rx_watermark_o; |
| output wire intr_tx_empty_o; |
| output wire intr_rx_overflow_o; |
| output wire intr_rx_frame_err_o; |
| output wire intr_rx_break_err_o; |
| output wire intr_rx_timeout_o; |
| output wire intr_rx_parity_err_o; |
| localparam [5:0] UART_INTR_STATE_OFFSET = 6'h00; |
| localparam [5:0] UART_INTR_ENABLE_OFFSET = 6'h04; |
| localparam [5:0] UART_INTR_TEST_OFFSET = 6'h08; |
| localparam [5:0] UART_CTRL_OFFSET = 6'h0c; |
| localparam [5:0] UART_STATUS_OFFSET = 6'h10; |
| localparam [5:0] UART_RDATA_OFFSET = 6'h14; |
| localparam [5:0] UART_WDATA_OFFSET = 6'h18; |
| localparam [5:0] UART_FIFO_CTRL_OFFSET = 6'h1c; |
| localparam [5:0] UART_FIFO_STATUS_OFFSET = 6'h20; |
| localparam [5:0] UART_OVRD_OFFSET = 6'h24; |
| localparam [5:0] UART_VAL_OFFSET = 6'h28; |
| localparam [5:0] UART_TIMEOUT_CTRL_OFFSET = 6'h2c; |
| localparam signed [31:0] UART_INTR_STATE = 0; |
| localparam signed [31:0] UART_INTR_ENABLE = 1; |
| localparam signed [31:0] UART_INTR_TEST = 2; |
| localparam signed [31:0] UART_CTRL = 3; |
| localparam signed [31:0] UART_STATUS = 4; |
| localparam signed [31:0] UART_RDATA = 5; |
| localparam signed [31:0] UART_WDATA = 6; |
| localparam signed [31:0] UART_FIFO_CTRL = 7; |
| localparam signed [31:0] UART_FIFO_STATUS = 8; |
| localparam signed [31:0] UART_OVRD = 9; |
| localparam signed [31:0] UART_VAL = 10; |
| localparam signed [31:0] UART_TIMEOUT_CTRL = 11; |
| localparam [47:0] UART_PERMIT = {4'b0001, 4'b0001, 4'b0001, 4'b1111, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0111, 4'b0001, 4'b0011, 4'b1111}; |
| wire [124:0] reg2hw; |
| wire [64:0] hw2reg; |
| uart_reg_top u_reg( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(tl_i), |
| .tl_o(tl_o), |
| .reg2hw(reg2hw), |
| .hw2reg(hw2reg), |
| .devmode_i(1'b1) |
| ); |
| uart_core uart_core( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .reg2hw(reg2hw), |
| .hw2reg(hw2reg), |
| .rx(cio_rx_i), |
| .tx(cio_tx_o), |
| .intr_tx_watermark_o(intr_tx_watermark_o), |
| .intr_rx_watermark_o(intr_rx_watermark_o), |
| .intr_tx_empty_o(intr_tx_empty_o), |
| .intr_rx_overflow_o(intr_rx_overflow_o), |
| .intr_rx_frame_err_o(intr_rx_frame_err_o), |
| .intr_rx_break_err_o(intr_rx_break_err_o), |
| .intr_rx_timeout_o(intr_rx_timeout_o), |
| .intr_rx_parity_err_o(intr_rx_parity_err_o) |
| ); |
| assign cio_tx_en_o = 1'b1; |
| endmodule |
| module uart_core ( |
| clk_i, |
| rst_ni, |
| reg2hw, |
| hw2reg, |
| rx, |
| tx, |
| intr_tx_watermark_o, |
| intr_rx_watermark_o, |
| intr_tx_empty_o, |
| intr_rx_overflow_o, |
| intr_rx_frame_err_o, |
| intr_rx_break_err_o, |
| intr_rx_timeout_o, |
| intr_rx_parity_err_o |
| ); |
| input clk_i; |
| input rst_ni; |
| input wire [124:0] reg2hw; |
| output wire [64:0] hw2reg; |
| input rx; |
| output wire tx; |
| output wire intr_tx_watermark_o; |
| output wire intr_rx_watermark_o; |
| output wire intr_tx_empty_o; |
| output wire intr_rx_overflow_o; |
| output wire intr_rx_frame_err_o; |
| output wire intr_rx_break_err_o; |
| output wire intr_rx_timeout_o; |
| output wire intr_rx_parity_err_o; |
| localparam [5:0] UART_INTR_STATE_OFFSET = 6'h00; |
| localparam [5:0] UART_INTR_ENABLE_OFFSET = 6'h04; |
| localparam [5:0] UART_INTR_TEST_OFFSET = 6'h08; |
| localparam [5:0] UART_CTRL_OFFSET = 6'h0c; |
| localparam [5:0] UART_STATUS_OFFSET = 6'h10; |
| localparam [5:0] UART_RDATA_OFFSET = 6'h14; |
| localparam [5:0] UART_WDATA_OFFSET = 6'h18; |
| localparam [5:0] UART_FIFO_CTRL_OFFSET = 6'h1c; |
| localparam [5:0] UART_FIFO_STATUS_OFFSET = 6'h20; |
| localparam [5:0] UART_OVRD_OFFSET = 6'h24; |
| localparam [5:0] UART_VAL_OFFSET = 6'h28; |
| localparam [5:0] UART_TIMEOUT_CTRL_OFFSET = 6'h2c; |
| localparam signed [31:0] UART_INTR_STATE = 0; |
| localparam signed [31:0] UART_INTR_ENABLE = 1; |
| localparam signed [31:0] UART_INTR_TEST = 2; |
| localparam signed [31:0] UART_CTRL = 3; |
| localparam signed [31:0] UART_STATUS = 4; |
| localparam signed [31:0] UART_RDATA = 5; |
| localparam signed [31:0] UART_WDATA = 6; |
| localparam signed [31:0] UART_FIFO_CTRL = 7; |
| localparam signed [31:0] UART_FIFO_STATUS = 8; |
| localparam signed [31:0] UART_OVRD = 9; |
| localparam signed [31:0] UART_VAL = 10; |
| localparam signed [31:0] UART_TIMEOUT_CTRL = 11; |
| localparam [47:0] UART_PERMIT = {4'b0001, 4'b0001, 4'b0001, 4'b1111, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0111, 4'b0001, 4'b0011, 4'b1111}; |
| localparam signed [31:0] NcoWidth = 16; |
| reg [15:0] rx_val_q; |
| wire [7:0] uart_rdata; |
| wire tick_baud_x16; |
| wire rx_tick_baud; |
| wire [5:0] tx_fifo_depth; |
| wire [5:0] rx_fifo_depth; |
| reg [5:0] rx_fifo_depth_prev_q; |
| wire [23:0] rx_timeout_count_d; |
| reg [23:0] rx_timeout_count_q; |
| wire [23:0] uart_rxto_val; |
| wire rx_fifo_depth_changed; |
| wire uart_rxto_en; |
| wire tx_enable; |
| wire rx_enable; |
| wire sys_loopback; |
| wire line_loopback; |
| wire rxnf_enable; |
| wire uart_fifo_rxrst; |
| wire uart_fifo_txrst; |
| wire [2:0] uart_fifo_rxilvl; |
| wire [1:0] uart_fifo_txilvl; |
| wire ovrd_tx_en; |
| wire ovrd_tx_val; |
| wire [7:0] tx_fifo_data; |
| wire tx_fifo_rready; |
| wire tx_fifo_rvalid; |
| wire tx_fifo_wready; |
| wire tx_uart_idle; |
| wire tx_out; |
| reg tx_out_q; |
| wire [7:0] rx_fifo_data; |
| wire rx_valid; |
| wire rx_fifo_wvalid; |
| wire rx_fifo_rvalid; |
| wire rx_fifo_wready; |
| wire rx_uart_idle; |
| wire rx_sync; |
| wire rx_in; |
| reg break_err; |
| wire [4:0] allzero_cnt_d; |
| reg [4:0] allzero_cnt_q; |
| wire allzero_err; |
| wire not_allzero_char; |
| wire event_tx_watermark; |
| wire event_rx_watermark; |
| wire event_tx_empty; |
| wire event_rx_overflow; |
| wire event_rx_frame_err; |
| wire event_rx_break_err; |
| wire event_rx_timeout; |
| wire event_rx_parity_err; |
| reg tx_watermark_d; |
| reg tx_watermark_prev_q; |
| reg rx_watermark_d; |
| reg rx_watermark_prev_q; |
| reg tx_uart_idle_q; |
| assign tx_enable = reg2hw[92]; |
| assign rx_enable = reg2hw[91]; |
| assign rxnf_enable = reg2hw[90]; |
| assign sys_loopback = reg2hw[89]; |
| assign line_loopback = reg2hw[88]; |
| assign uart_fifo_rxrst = reg2hw[37] & reg2hw[36]; |
| assign uart_fifo_txrst = reg2hw[35] & reg2hw[34]; |
| assign uart_fifo_rxilvl = reg2hw[33-:3]; |
| assign uart_fifo_txilvl = reg2hw[29-:2]; |
| assign ovrd_tx_en = reg2hw[26]; |
| assign ovrd_tx_val = reg2hw[25]; |
| reg break_st_q; |
| assign not_allzero_char = rx_valid & (~event_rx_frame_err | (rx_fifo_data != 8'h00)); |
| assign allzero_err = event_rx_frame_err & (rx_fifo_data == 8'h00); |
| localparam [0:0] BRK_WAIT = 1; |
| assign allzero_cnt_d = ((break_st_q == BRK_WAIT) || not_allzero_char ? 5'h00 : (allzero_err ? allzero_cnt_q + 5'd1 : allzero_cnt_q)); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| allzero_cnt_q <= {5 {1'sb0}}; |
| else if (rx_enable) |
| allzero_cnt_q <= allzero_cnt_d; |
| always @(*) |
| case (reg2hw[85-:2]) |
| 2'h0: break_err = allzero_cnt_d >= 5'd2; |
| 2'h1: break_err = allzero_cnt_d >= 5'd4; |
| 2'h2: break_err = allzero_cnt_d >= 5'd8; |
| default: break_err = allzero_cnt_d >= 5'd16; |
| endcase |
| localparam [0:0] BRK_CHK = 0; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| break_st_q <= BRK_CHK; |
| else |
| case (break_st_q) |
| BRK_CHK: |
| if (event_rx_break_err) |
| break_st_q <= BRK_WAIT; |
| BRK_WAIT: |
| if (rx_in) |
| break_st_q <= BRK_CHK; |
| default: break_st_q <= BRK_CHK; |
| endcase |
| assign hw2reg[15-:16] = rx_val_q; |
| assign hw2reg[42-:8] = uart_rdata; |
| assign hw2reg[43] = ~rx_fifo_rvalid; |
| assign hw2reg[44] = rx_uart_idle; |
| assign hw2reg[45] = tx_uart_idle & ~tx_fifo_rvalid; |
| assign hw2reg[46] = ~tx_fifo_rvalid; |
| assign hw2reg[47] = ~rx_fifo_wready; |
| assign hw2reg[48] = ~tx_fifo_wready; |
| assign hw2reg[27-:6] = tx_fifo_depth; |
| assign hw2reg[21-:6] = rx_fifo_depth; |
| assign hw2reg[31] = 1'b0; |
| assign hw2reg[34-:3] = 3'h0; |
| assign hw2reg[28] = 1'b0; |
| assign hw2reg[30-:2] = 2'h0; |
| reg [NcoWidth:0] nco_sum_q; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| nco_sum_q <= 17'h00000; |
| else if (tx_enable || rx_enable) |
| nco_sum_q <= {1'b0, nco_sum_q[NcoWidth - 1:0]} + {1'b0, reg2hw[NcoWidth + 67:68]}; |
| assign tick_baud_x16 = nco_sum_q[16]; |
| assign tx_fifo_rready = (tx_uart_idle & tx_fifo_rvalid) & tx_enable; |
| prim_fifo_sync #( |
| .Width(8), |
| .Pass(1'b0), |
| .Depth(32) |
| ) u_uart_txfifo( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .clr_i(uart_fifo_txrst), |
| .wvalid_i(reg2hw[38]), |
| .wready_o(tx_fifo_wready), |
| .wdata_i(reg2hw[46-:8]), |
| .depth_o(tx_fifo_depth), |
| .rvalid_o(tx_fifo_rvalid), |
| .rready_i(tx_fifo_rready), |
| .rdata_o(tx_fifo_data) |
| ); |
| uart_tx uart_tx( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tx_enable(tx_enable), |
| .tick_baud_x16(tick_baud_x16), |
| .parity_enable(reg2hw[87]), |
| .wr(tx_fifo_rready), |
| .wr_parity(^tx_fifo_data ^ reg2hw[86]), |
| .wr_data(tx_fifo_data), |
| .idle(tx_uart_idle), |
| .tx(tx_out) |
| ); |
| assign tx = (line_loopback ? rx : tx_out_q); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| tx_out_q <= 1'b1; |
| else if (ovrd_tx_en) |
| tx_out_q <= ovrd_tx_val; |
| else if (sys_loopback) |
| tx_out_q <= 1'b1; |
| else |
| tx_out_q <= tx_out; |
| prim_generic_flop_2sync #( |
| .Width(1), |
| .ResetValue(1'b1) |
| ) sync_rx( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .d_i(rx), |
| .q_o(rx_sync) |
| ); |
| reg rx_sync_q1; |
| reg rx_sync_q2; |
| wire rx_in_mx; |
| wire rx_in_maj; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| rx_sync_q1 <= 1'b1; |
| rx_sync_q2 <= 1'b1; |
| end |
| else begin |
| rx_sync_q1 <= rx_sync; |
| rx_sync_q2 <= rx_sync_q1; |
| end |
| assign rx_in_maj = ((rx_sync & rx_sync_q1) | (rx_sync & rx_sync_q2)) | (rx_sync_q1 & rx_sync_q2); |
| assign rx_in_mx = (rxnf_enable ? rx_in_maj : rx_sync); |
| assign rx_in = (sys_loopback ? tx_out : (line_loopback ? 1'b1 : rx_in_mx)); |
| uart_rx uart_rx( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .rx_enable(rx_enable), |
| .tick_baud_x16(tick_baud_x16), |
| .parity_enable(reg2hw[87]), |
| .parity_odd(reg2hw[86]), |
| .tick_baud(rx_tick_baud), |
| .rx_valid(rx_valid), |
| .rx_data(rx_fifo_data), |
| .idle(rx_uart_idle), |
| .frame_err(event_rx_frame_err), |
| .rx(rx_in), |
| .rx_parity_err(event_rx_parity_err) |
| ); |
| assign rx_fifo_wvalid = (rx_valid & ~event_rx_frame_err) & ~event_rx_parity_err; |
| prim_fifo_sync #( |
| .Width(8), |
| .Pass(1'b0), |
| .Depth(32) |
| ) u_uart_rxfifo( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .clr_i(uart_fifo_rxrst), |
| .wvalid_i(rx_fifo_wvalid), |
| .wready_o(rx_fifo_wready), |
| .wdata_i(rx_fifo_data), |
| .depth_o(rx_fifo_depth), |
| .rvalid_o(rx_fifo_rvalid), |
| .rready_i(reg2hw[47]), |
| .rdata_o(uart_rdata) |
| ); |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| rx_val_q <= 16'h0000; |
| else if (tick_baud_x16) |
| rx_val_q <= {rx_val_q[14:0], rx_in}; |
| always @(*) |
| case (uart_fifo_txilvl) |
| 2'h0: tx_watermark_d = tx_fifo_depth < 6'd2; |
| 2'h1: tx_watermark_d = tx_fifo_depth < 6'd4; |
| 2'h2: tx_watermark_d = tx_fifo_depth < 6'd8; |
| default: tx_watermark_d = tx_fifo_depth < 6'd16; |
| endcase |
| assign event_tx_watermark = tx_watermark_d & ~tx_watermark_prev_q; |
| assign event_tx_empty = (~tx_fifo_rvalid & ~tx_uart_idle_q) & tx_uart_idle; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| tx_watermark_prev_q <= 1'b1; |
| rx_watermark_prev_q <= 1'b0; |
| tx_uart_idle_q <= 1'b1; |
| end |
| else begin |
| tx_watermark_prev_q <= tx_watermark_d; |
| rx_watermark_prev_q <= rx_watermark_d; |
| tx_uart_idle_q <= tx_uart_idle; |
| end |
| always @(*) |
| case (uart_fifo_rxilvl) |
| 3'h0: rx_watermark_d = rx_fifo_depth >= 6'd1; |
| 3'h1: rx_watermark_d = rx_fifo_depth >= 6'd4; |
| 3'h2: rx_watermark_d = rx_fifo_depth >= 6'd8; |
| 3'h3: rx_watermark_d = rx_fifo_depth >= 6'd16; |
| 3'h4: rx_watermark_d = rx_fifo_depth >= 6'd30; |
| default: rx_watermark_d = 1'b0; |
| endcase |
| assign event_rx_watermark = rx_watermark_d & ~rx_watermark_prev_q; |
| assign uart_rxto_en = reg2hw[-0]; |
| assign uart_rxto_val = reg2hw[24-:24]; |
| assign rx_fifo_depth_changed = rx_fifo_depth != rx_fifo_depth_prev_q; |
| assign rx_timeout_count_d = (uart_rxto_en == 1'b0 ? 24'd0 : (event_rx_timeout ? 24'd0 : (rx_fifo_depth_changed ? 24'd0 : (rx_fifo_depth == 5'd0 ? 24'd0 : (rx_tick_baud ? rx_timeout_count_q + 24'd1 : rx_timeout_count_q))))); |
| assign event_rx_timeout = (rx_timeout_count_q == uart_rxto_val) & uart_rxto_en; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| rx_timeout_count_q <= 24'd0; |
| rx_fifo_depth_prev_q <= 6'd0; |
| end |
| else begin |
| rx_timeout_count_q <= rx_timeout_count_d; |
| rx_fifo_depth_prev_q <= rx_fifo_depth; |
| end |
| assign event_rx_overflow = rx_fifo_wvalid & ~rx_fifo_wready; |
| assign event_rx_break_err = break_err & (break_st_q == BRK_CHK); |
| prim_intr_hw #(.Width(1)) intr_hw_tx_watermark( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .event_intr_i(event_tx_watermark), |
| .reg2hw_intr_enable_q_i(reg2hw[116]), |
| .reg2hw_intr_test_q_i(reg2hw[108]), |
| .reg2hw_intr_test_qe_i(reg2hw[107]), |
| .reg2hw_intr_state_q_i(reg2hw[124]), |
| .hw2reg_intr_state_de_o(hw2reg[63]), |
| .hw2reg_intr_state_d_o(hw2reg[64]), |
| .intr_o(intr_tx_watermark_o) |
| ); |
| prim_intr_hw #(.Width(1)) intr_hw_rx_watermark( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .event_intr_i(event_rx_watermark), |
| .reg2hw_intr_enable_q_i(reg2hw[115]), |
| .reg2hw_intr_test_q_i(reg2hw[106]), |
| .reg2hw_intr_test_qe_i(reg2hw[105]), |
| .reg2hw_intr_state_q_i(reg2hw[123]), |
| .hw2reg_intr_state_de_o(hw2reg[61]), |
| .hw2reg_intr_state_d_o(hw2reg[62]), |
| .intr_o(intr_rx_watermark_o) |
| ); |
| prim_intr_hw #(.Width(1)) intr_hw_tx_empty( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .event_intr_i(event_tx_empty), |
| .reg2hw_intr_enable_q_i(reg2hw[114]), |
| .reg2hw_intr_test_q_i(reg2hw[104]), |
| .reg2hw_intr_test_qe_i(reg2hw[103]), |
| .reg2hw_intr_state_q_i(reg2hw[122]), |
| .hw2reg_intr_state_de_o(hw2reg[59]), |
| .hw2reg_intr_state_d_o(hw2reg[60]), |
| .intr_o(intr_tx_empty_o) |
| ); |
| prim_intr_hw #(.Width(1)) intr_hw_rx_overflow( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .event_intr_i(event_rx_overflow), |
| .reg2hw_intr_enable_q_i(reg2hw[113]), |
| .reg2hw_intr_test_q_i(reg2hw[102]), |
| .reg2hw_intr_test_qe_i(reg2hw[101]), |
| .reg2hw_intr_state_q_i(reg2hw[121]), |
| .hw2reg_intr_state_de_o(hw2reg[57]), |
| .hw2reg_intr_state_d_o(hw2reg[58]), |
| .intr_o(intr_rx_overflow_o) |
| ); |
| prim_intr_hw #(.Width(1)) intr_hw_rx_frame_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .event_intr_i(event_rx_frame_err), |
| .reg2hw_intr_enable_q_i(reg2hw[112]), |
| .reg2hw_intr_test_q_i(reg2hw[100]), |
| .reg2hw_intr_test_qe_i(reg2hw[99]), |
| .reg2hw_intr_state_q_i(reg2hw[120]), |
| .hw2reg_intr_state_de_o(hw2reg[55]), |
| .hw2reg_intr_state_d_o(hw2reg[56]), |
| .intr_o(intr_rx_frame_err_o) |
| ); |
| prim_intr_hw #(.Width(1)) intr_hw_rx_break_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .event_intr_i(event_rx_break_err), |
| .reg2hw_intr_enable_q_i(reg2hw[111]), |
| .reg2hw_intr_test_q_i(reg2hw[98]), |
| .reg2hw_intr_test_qe_i(reg2hw[97]), |
| .reg2hw_intr_state_q_i(reg2hw[119]), |
| .hw2reg_intr_state_de_o(hw2reg[53]), |
| .hw2reg_intr_state_d_o(hw2reg[54]), |
| .intr_o(intr_rx_break_err_o) |
| ); |
| prim_intr_hw #(.Width(1)) intr_hw_rx_timeout( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .event_intr_i(event_rx_timeout), |
| .reg2hw_intr_enable_q_i(reg2hw[110]), |
| .reg2hw_intr_test_q_i(reg2hw[96]), |
| .reg2hw_intr_test_qe_i(reg2hw[95]), |
| .reg2hw_intr_state_q_i(reg2hw[118]), |
| .hw2reg_intr_state_de_o(hw2reg[51]), |
| .hw2reg_intr_state_d_o(hw2reg[52]), |
| .intr_o(intr_rx_timeout_o) |
| ); |
| prim_intr_hw #(.Width(1)) intr_hw_rx_parity_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .event_intr_i(event_rx_parity_err), |
| .reg2hw_intr_enable_q_i(reg2hw[109]), |
| .reg2hw_intr_test_q_i(reg2hw[94]), |
| .reg2hw_intr_test_qe_i(reg2hw[93]), |
| .reg2hw_intr_state_q_i(reg2hw[117]), |
| .hw2reg_intr_state_de_o(hw2reg[49]), |
| .hw2reg_intr_state_d_o(hw2reg[50]), |
| .intr_o(intr_rx_parity_err_o) |
| ); |
| endmodule |
| module uart_reg_top ( |
| clk_i, |
| rst_ni, |
| tl_i, |
| tl_o, |
| reg2hw, |
| hw2reg, |
| devmode_i |
| ); |
| input clk_i; |
| input rst_ni; |
| localparam signed [31:0] top_pkg_TL_AIW = 8; |
| localparam signed [31:0] top_pkg_TL_AW = 32; |
| localparam signed [31:0] top_pkg_TL_DW = 32; |
| localparam signed [31:0] top_pkg_TL_DBW = top_pkg_TL_DW >> 3; |
| localparam signed [31:0] top_pkg_TL_SZW = $clog2($clog2(top_pkg_TL_DBW) + 1); |
| input wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_i; |
| localparam signed [31:0] top_pkg_TL_DIW = 1; |
| localparam signed [31:0] top_pkg_TL_DUW = 16; |
| output wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_o; |
| output wire [124:0] reg2hw; |
| input wire [64:0] hw2reg; |
| input devmode_i; |
| localparam [5:0] UART_INTR_STATE_OFFSET = 6'h00; |
| localparam [5:0] UART_INTR_ENABLE_OFFSET = 6'h04; |
| localparam [5:0] UART_INTR_TEST_OFFSET = 6'h08; |
| localparam [5:0] UART_CTRL_OFFSET = 6'h0c; |
| localparam [5:0] UART_STATUS_OFFSET = 6'h10; |
| localparam [5:0] UART_RDATA_OFFSET = 6'h14; |
| localparam [5:0] UART_WDATA_OFFSET = 6'h18; |
| localparam [5:0] UART_FIFO_CTRL_OFFSET = 6'h1c; |
| localparam [5:0] UART_FIFO_STATUS_OFFSET = 6'h20; |
| localparam [5:0] UART_OVRD_OFFSET = 6'h24; |
| localparam [5:0] UART_VAL_OFFSET = 6'h28; |
| localparam [5:0] UART_TIMEOUT_CTRL_OFFSET = 6'h2c; |
| localparam signed [31:0] UART_INTR_STATE = 0; |
| localparam signed [31:0] UART_INTR_ENABLE = 1; |
| localparam signed [31:0] UART_INTR_TEST = 2; |
| localparam signed [31:0] UART_CTRL = 3; |
| localparam signed [31:0] UART_STATUS = 4; |
| localparam signed [31:0] UART_RDATA = 5; |
| localparam signed [31:0] UART_WDATA = 6; |
| localparam signed [31:0] UART_FIFO_CTRL = 7; |
| localparam signed [31:0] UART_FIFO_STATUS = 8; |
| localparam signed [31:0] UART_OVRD = 9; |
| localparam signed [31:0] UART_VAL = 10; |
| localparam signed [31:0] UART_TIMEOUT_CTRL = 11; |
| localparam [47:0] UART_PERMIT = {4'b0001, 4'b0001, 4'b0001, 4'b1111, 4'b0001, 4'b0001, 4'b0001, 4'b0001, 4'b0111, 4'b0001, 4'b0011, 4'b1111}; |
| localparam signed [31:0] AW = 6; |
| localparam signed [31:0] DW = 32; |
| localparam signed [31:0] DBW = DW / 8; |
| wire reg_we; |
| wire reg_re; |
| wire [AW - 1:0] reg_addr; |
| wire [DW - 1:0] reg_wdata; |
| wire [DBW - 1:0] reg_be; |
| wire [DW - 1:0] reg_rdata; |
| wire reg_error; |
| wire addrmiss; |
| reg wr_err; |
| reg [DW - 1:0] reg_rdata_next; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_AW) + top_pkg_TL_DBW) + top_pkg_TL_DW) + 16:0] tl_reg_h2d; |
| wire [(((((7 + top_pkg_TL_SZW) + top_pkg_TL_AIW) + top_pkg_TL_DIW) + top_pkg_TL_DW) + top_pkg_TL_DUW) + 1:0] tl_reg_d2h; |
| assign tl_reg_h2d = tl_i; |
| assign tl_o = tl_reg_d2h; |
| tlul_adapter_reg #( |
| .RegAw(AW), |
| .RegDw(DW) |
| ) u_reg_if( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .tl_i(tl_reg_h2d), |
| .tl_o(tl_reg_d2h), |
| .we_o(reg_we), |
| .re_o(reg_re), |
| .addr_o(reg_addr), |
| .wdata_o(reg_wdata), |
| .be_o(reg_be), |
| .rdata_i(reg_rdata), |
| .error_i(reg_error) |
| ); |
| assign reg_rdata = reg_rdata_next; |
| assign reg_error = (devmode_i & addrmiss) | wr_err; |
| wire intr_state_tx_watermark_qs; |
| wire intr_state_tx_watermark_wd; |
| wire intr_state_tx_watermark_we; |
| wire intr_state_rx_watermark_qs; |
| wire intr_state_rx_watermark_wd; |
| wire intr_state_rx_watermark_we; |
| wire intr_state_tx_empty_qs; |
| wire intr_state_tx_empty_wd; |
| wire intr_state_tx_empty_we; |
| wire intr_state_rx_overflow_qs; |
| wire intr_state_rx_overflow_wd; |
| wire intr_state_rx_overflow_we; |
| wire intr_state_rx_frame_err_qs; |
| wire intr_state_rx_frame_err_wd; |
| wire intr_state_rx_frame_err_we; |
| wire intr_state_rx_break_err_qs; |
| wire intr_state_rx_break_err_wd; |
| wire intr_state_rx_break_err_we; |
| wire intr_state_rx_timeout_qs; |
| wire intr_state_rx_timeout_wd; |
| wire intr_state_rx_timeout_we; |
| wire intr_state_rx_parity_err_qs; |
| wire intr_state_rx_parity_err_wd; |
| wire intr_state_rx_parity_err_we; |
| wire intr_enable_tx_watermark_qs; |
| wire intr_enable_tx_watermark_wd; |
| wire intr_enable_tx_watermark_we; |
| wire intr_enable_rx_watermark_qs; |
| wire intr_enable_rx_watermark_wd; |
| wire intr_enable_rx_watermark_we; |
| wire intr_enable_tx_empty_qs; |
| wire intr_enable_tx_empty_wd; |
| wire intr_enable_tx_empty_we; |
| wire intr_enable_rx_overflow_qs; |
| wire intr_enable_rx_overflow_wd; |
| wire intr_enable_rx_overflow_we; |
| wire intr_enable_rx_frame_err_qs; |
| wire intr_enable_rx_frame_err_wd; |
| wire intr_enable_rx_frame_err_we; |
| wire intr_enable_rx_break_err_qs; |
| wire intr_enable_rx_break_err_wd; |
| wire intr_enable_rx_break_err_we; |
| wire intr_enable_rx_timeout_qs; |
| wire intr_enable_rx_timeout_wd; |
| wire intr_enable_rx_timeout_we; |
| wire intr_enable_rx_parity_err_qs; |
| wire intr_enable_rx_parity_err_wd; |
| wire intr_enable_rx_parity_err_we; |
| wire intr_test_tx_watermark_wd; |
| wire intr_test_tx_watermark_we; |
| wire intr_test_rx_watermark_wd; |
| wire intr_test_rx_watermark_we; |
| wire intr_test_tx_empty_wd; |
| wire intr_test_tx_empty_we; |
| wire intr_test_rx_overflow_wd; |
| wire intr_test_rx_overflow_we; |
| wire intr_test_rx_frame_err_wd; |
| wire intr_test_rx_frame_err_we; |
| wire intr_test_rx_break_err_wd; |
| wire intr_test_rx_break_err_we; |
| wire intr_test_rx_timeout_wd; |
| wire intr_test_rx_timeout_we; |
| wire intr_test_rx_parity_err_wd; |
| wire intr_test_rx_parity_err_we; |
| wire ctrl_tx_qs; |
| wire ctrl_tx_wd; |
| wire ctrl_tx_we; |
| wire ctrl_rx_qs; |
| wire ctrl_rx_wd; |
| wire ctrl_rx_we; |
| wire ctrl_nf_qs; |
| wire ctrl_nf_wd; |
| wire ctrl_nf_we; |
| wire ctrl_slpbk_qs; |
| wire ctrl_slpbk_wd; |
| wire ctrl_slpbk_we; |
| wire ctrl_llpbk_qs; |
| wire ctrl_llpbk_wd; |
| wire ctrl_llpbk_we; |
| wire ctrl_parity_en_qs; |
| wire ctrl_parity_en_wd; |
| wire ctrl_parity_en_we; |
| wire ctrl_parity_odd_qs; |
| wire ctrl_parity_odd_wd; |
| wire ctrl_parity_odd_we; |
| wire [1:0] ctrl_rxblvl_qs; |
| wire [1:0] ctrl_rxblvl_wd; |
| wire ctrl_rxblvl_we; |
| wire [15:0] ctrl_nco_qs; |
| wire [15:0] ctrl_nco_wd; |
| wire ctrl_nco_we; |
| wire status_txfull_qs; |
| wire status_txfull_re; |
| wire status_rxfull_qs; |
| wire status_rxfull_re; |
| wire status_txempty_qs; |
| wire status_txempty_re; |
| wire status_txidle_qs; |
| wire status_txidle_re; |
| wire status_rxidle_qs; |
| wire status_rxidle_re; |
| wire status_rxempty_qs; |
| wire status_rxempty_re; |
| wire [7:0] rdata_qs; |
| wire rdata_re; |
| wire [7:0] wdata_wd; |
| wire wdata_we; |
| wire fifo_ctrl_rxrst_wd; |
| wire fifo_ctrl_rxrst_we; |
| wire fifo_ctrl_txrst_wd; |
| wire fifo_ctrl_txrst_we; |
| wire [2:0] fifo_ctrl_rxilvl_qs; |
| wire [2:0] fifo_ctrl_rxilvl_wd; |
| wire fifo_ctrl_rxilvl_we; |
| wire [1:0] fifo_ctrl_txilvl_qs; |
| wire [1:0] fifo_ctrl_txilvl_wd; |
| wire fifo_ctrl_txilvl_we; |
| wire [5:0] fifo_status_txlvl_qs; |
| wire fifo_status_txlvl_re; |
| wire [5:0] fifo_status_rxlvl_qs; |
| wire fifo_status_rxlvl_re; |
| wire ovrd_txen_qs; |
| wire ovrd_txen_wd; |
| wire ovrd_txen_we; |
| wire ovrd_txval_qs; |
| wire ovrd_txval_wd; |
| wire ovrd_txval_we; |
| wire [15:0] val_qs; |
| wire val_re; |
| wire [23:0] timeout_ctrl_val_qs; |
| wire [23:0] timeout_ctrl_val_wd; |
| wire timeout_ctrl_val_we; |
| wire timeout_ctrl_en_qs; |
| wire timeout_ctrl_en_wd; |
| wire timeout_ctrl_en_we; |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(24), |
| .SWACCESS("W1C"), |
| .RESVAL(1'h0) |
| ) u_intr_state_tx_watermark( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_state_tx_watermark_we), |
| .wd(intr_state_tx_watermark_wd), |
| .de(hw2reg[63]), |
| .d(hw2reg[64]), |
| .qe(), |
| .q(reg2hw[124]), |
| .qs(intr_state_tx_watermark_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(24), |
| .SWACCESS("W1C"), |
| .RESVAL(1'h0) |
| ) u_intr_state_rx_watermark( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_state_rx_watermark_we), |
| .wd(intr_state_rx_watermark_wd), |
| .de(hw2reg[61]), |
| .d(hw2reg[62]), |
| .qe(), |
| .q(reg2hw[123]), |
| .qs(intr_state_rx_watermark_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(24), |
| .SWACCESS("W1C"), |
| .RESVAL(1'h0) |
| ) u_intr_state_tx_empty( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_state_tx_empty_we), |
| .wd(intr_state_tx_empty_wd), |
| .de(hw2reg[59]), |
| .d(hw2reg[60]), |
| .qe(), |
| .q(reg2hw[122]), |
| .qs(intr_state_tx_empty_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(24), |
| .SWACCESS("W1C"), |
| .RESVAL(1'h0) |
| ) u_intr_state_rx_overflow( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_state_rx_overflow_we), |
| .wd(intr_state_rx_overflow_wd), |
| .de(hw2reg[57]), |
| .d(hw2reg[58]), |
| .qe(), |
| .q(reg2hw[121]), |
| .qs(intr_state_rx_overflow_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(24), |
| .SWACCESS("W1C"), |
| .RESVAL(1'h0) |
| ) u_intr_state_rx_frame_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_state_rx_frame_err_we), |
| .wd(intr_state_rx_frame_err_wd), |
| .de(hw2reg[55]), |
| .d(hw2reg[56]), |
| .qe(), |
| .q(reg2hw[120]), |
| .qs(intr_state_rx_frame_err_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(24), |
| .SWACCESS("W1C"), |
| .RESVAL(1'h0) |
| ) u_intr_state_rx_break_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_state_rx_break_err_we), |
| .wd(intr_state_rx_break_err_wd), |
| .de(hw2reg[53]), |
| .d(hw2reg[54]), |
| .qe(), |
| .q(reg2hw[119]), |
| .qs(intr_state_rx_break_err_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(24), |
| .SWACCESS("W1C"), |
| .RESVAL(1'h0) |
| ) u_intr_state_rx_timeout( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_state_rx_timeout_we), |
| .wd(intr_state_rx_timeout_wd), |
| .de(hw2reg[51]), |
| .d(hw2reg[52]), |
| .qe(), |
| .q(reg2hw[118]), |
| .qs(intr_state_rx_timeout_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(24), |
| .SWACCESS("W1C"), |
| .RESVAL(1'h0) |
| ) u_intr_state_rx_parity_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_state_rx_parity_err_we), |
| .wd(intr_state_rx_parity_err_wd), |
| .de(hw2reg[49]), |
| .d(hw2reg[50]), |
| .qe(), |
| .q(reg2hw[117]), |
| .qs(intr_state_rx_parity_err_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_intr_enable_tx_watermark( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_enable_tx_watermark_we), |
| .wd(intr_enable_tx_watermark_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[116]), |
| .qs(intr_enable_tx_watermark_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_intr_enable_rx_watermark( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_enable_rx_watermark_we), |
| .wd(intr_enable_rx_watermark_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[115]), |
| .qs(intr_enable_rx_watermark_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_intr_enable_tx_empty( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_enable_tx_empty_we), |
| .wd(intr_enable_tx_empty_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[114]), |
| .qs(intr_enable_tx_empty_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_intr_enable_rx_overflow( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_enable_rx_overflow_we), |
| .wd(intr_enable_rx_overflow_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[113]), |
| .qs(intr_enable_rx_overflow_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_intr_enable_rx_frame_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_enable_rx_frame_err_we), |
| .wd(intr_enable_rx_frame_err_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[112]), |
| .qs(intr_enable_rx_frame_err_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_intr_enable_rx_break_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_enable_rx_break_err_we), |
| .wd(intr_enable_rx_break_err_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[111]), |
| .qs(intr_enable_rx_break_err_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_intr_enable_rx_timeout( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_enable_rx_timeout_we), |
| .wd(intr_enable_rx_timeout_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[110]), |
| .qs(intr_enable_rx_timeout_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_intr_enable_rx_parity_err( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(intr_enable_rx_parity_err_we), |
| .wd(intr_enable_rx_parity_err_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[109]), |
| .qs(intr_enable_rx_parity_err_qs) |
| ); |
| prim_subreg_ext #(.DW(1)) u_intr_test_tx_watermark( |
| .re(1'b0), |
| .we(intr_test_tx_watermark_we), |
| .wd(intr_test_tx_watermark_wd), |
| .d(1'sb0), |
| .qre(), |
| .qe(reg2hw[107]), |
| .q(reg2hw[108]), |
| .qs() |
| ); |
| prim_subreg_ext #(.DW(1)) u_intr_test_rx_watermark( |
| .re(1'b0), |
| .we(intr_test_rx_watermark_we), |
| .wd(intr_test_rx_watermark_wd), |
| .d(1'sb0), |
| .qre(), |
| .qe(reg2hw[105]), |
| .q(reg2hw[106]), |
| .qs() |
| ); |
| prim_subreg_ext #(.DW(1)) u_intr_test_tx_empty( |
| .re(1'b0), |
| .we(intr_test_tx_empty_we), |
| .wd(intr_test_tx_empty_wd), |
| .d(1'sb0), |
| .qre(), |
| .qe(reg2hw[103]), |
| .q(reg2hw[104]), |
| .qs() |
| ); |
| prim_subreg_ext #(.DW(1)) u_intr_test_rx_overflow( |
| .re(1'b0), |
| .we(intr_test_rx_overflow_we), |
| .wd(intr_test_rx_overflow_wd), |
| .d(1'sb0), |
| .qre(), |
| .qe(reg2hw[101]), |
| .q(reg2hw[102]), |
| .qs() |
| ); |
| prim_subreg_ext #(.DW(1)) u_intr_test_rx_frame_err( |
| .re(1'b0), |
| .we(intr_test_rx_frame_err_we), |
| .wd(intr_test_rx_frame_err_wd), |
| .d(1'sb0), |
| .qre(), |
| .qe(reg2hw[99]), |
| .q(reg2hw[100]), |
| .qs() |
| ); |
| prim_subreg_ext #(.DW(1)) u_intr_test_rx_break_err( |
| .re(1'b0), |
| .we(intr_test_rx_break_err_we), |
| .wd(intr_test_rx_break_err_wd), |
| .d(1'sb0), |
| .qre(), |
| .qe(reg2hw[97]), |
| .q(reg2hw[98]), |
| .qs() |
| ); |
| prim_subreg_ext #(.DW(1)) u_intr_test_rx_timeout( |
| .re(1'b0), |
| .we(intr_test_rx_timeout_we), |
| .wd(intr_test_rx_timeout_wd), |
| .d(1'sb0), |
| .qre(), |
| .qe(reg2hw[95]), |
| .q(reg2hw[96]), |
| .qs() |
| ); |
| prim_subreg_ext #(.DW(1)) u_intr_test_rx_parity_err( |
| .re(1'b0), |
| .we(intr_test_rx_parity_err_we), |
| .wd(intr_test_rx_parity_err_wd), |
| .d(1'sb0), |
| .qre(), |
| .qe(reg2hw[93]), |
| .q(reg2hw[94]), |
| .qs() |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ctrl_tx( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_tx_we), |
| .wd(ctrl_tx_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[92]), |
| .qs(ctrl_tx_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ctrl_rx( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_rx_we), |
| .wd(ctrl_rx_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[91]), |
| .qs(ctrl_rx_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ctrl_nf( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_nf_we), |
| .wd(ctrl_nf_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[90]), |
| .qs(ctrl_nf_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ctrl_slpbk( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_slpbk_we), |
| .wd(ctrl_slpbk_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[89]), |
| .qs(ctrl_slpbk_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ctrl_llpbk( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_llpbk_we), |
| .wd(ctrl_llpbk_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[88]), |
| .qs(ctrl_llpbk_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ctrl_parity_en( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_parity_en_we), |
| .wd(ctrl_parity_en_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[87]), |
| .qs(ctrl_parity_en_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ctrl_parity_odd( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_parity_odd_we), |
| .wd(ctrl_parity_odd_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[86]), |
| .qs(ctrl_parity_odd_qs) |
| ); |
| prim_subreg #( |
| .DW(2), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(2'h0) |
| ) u_ctrl_rxblvl( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_rxblvl_we), |
| .wd(ctrl_rxblvl_wd), |
| .de(1'b0), |
| .d({2 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[85-:2]), |
| .qs(ctrl_rxblvl_qs) |
| ); |
| prim_subreg #( |
| .DW(16), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(16'h0000) |
| ) u_ctrl_nco( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ctrl_nco_we), |
| .wd(ctrl_nco_wd), |
| .de(1'b0), |
| .d({16 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[83-:16]), |
| .qs(ctrl_nco_qs) |
| ); |
| prim_subreg_ext #(.DW(1)) u_status_txfull( |
| .re(status_txfull_re), |
| .we(1'b0), |
| .wd(1'sb0), |
| .d(hw2reg[48]), |
| .qre(reg2hw[66]), |
| .qe(), |
| .q(reg2hw[67]), |
| .qs(status_txfull_qs) |
| ); |
| prim_subreg_ext #(.DW(1)) u_status_rxfull( |
| .re(status_rxfull_re), |
| .we(1'b0), |
| .wd(1'sb0), |
| .d(hw2reg[47]), |
| .qre(reg2hw[64]), |
| .qe(), |
| .q(reg2hw[65]), |
| .qs(status_rxfull_qs) |
| ); |
| prim_subreg_ext #(.DW(1)) u_status_txempty( |
| .re(status_txempty_re), |
| .we(1'b0), |
| .wd(1'sb0), |
| .d(hw2reg[46]), |
| .qre(reg2hw[62]), |
| .qe(), |
| .q(reg2hw[63]), |
| .qs(status_txempty_qs) |
| ); |
| prim_subreg_ext #(.DW(1)) u_status_txidle( |
| .re(status_txidle_re), |
| .we(1'b0), |
| .wd(1'sb0), |
| .d(hw2reg[45]), |
| .qre(reg2hw[60]), |
| .qe(), |
| .q(reg2hw[61]), |
| .qs(status_txidle_qs) |
| ); |
| prim_subreg_ext #(.DW(1)) u_status_rxidle( |
| .re(status_rxidle_re), |
| .we(1'b0), |
| .wd(1'sb0), |
| .d(hw2reg[44]), |
| .qre(reg2hw[58]), |
| .qe(), |
| .q(reg2hw[59]), |
| .qs(status_rxidle_qs) |
| ); |
| prim_subreg_ext #(.DW(1)) u_status_rxempty( |
| .re(status_rxempty_re), |
| .we(1'b0), |
| .wd(1'sb0), |
| .d(hw2reg[43]), |
| .qre(reg2hw[56]), |
| .qe(), |
| .q(reg2hw[57]), |
| .qs(status_rxempty_qs) |
| ); |
| prim_subreg_ext #(.DW(8)) u_rdata( |
| .re(rdata_re), |
| .we(1'b0), |
| .wd({8 {1'sb0}}), |
| .d(hw2reg[42-:8]), |
| .qre(reg2hw[47]), |
| .qe(), |
| .q(reg2hw[55-:8]), |
| .qs(rdata_qs) |
| ); |
| prim_subreg #( |
| .DW(8), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("WO"), |
| .RESVAL(8'h00) |
| ) u_wdata( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(wdata_we), |
| .wd(wdata_wd), |
| .de(1'b0), |
| .d({8 {1'sb0}}), |
| .qe(reg2hw[38]), |
| .q(reg2hw[46-:8]), |
| .qs() |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("WO"), |
| .RESVAL(1'h0) |
| ) u_fifo_ctrl_rxrst( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(fifo_ctrl_rxrst_we), |
| .wd(fifo_ctrl_rxrst_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(reg2hw[36]), |
| .q(reg2hw[37]), |
| .qs() |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("WO"), |
| .RESVAL(1'h0) |
| ) u_fifo_ctrl_txrst( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(fifo_ctrl_txrst_we), |
| .wd(fifo_ctrl_txrst_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(reg2hw[34]), |
| .q(reg2hw[35]), |
| .qs() |
| ); |
| prim_subreg #( |
| .DW(3), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(3'h0) |
| ) u_fifo_ctrl_rxilvl( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(fifo_ctrl_rxilvl_we), |
| .wd(fifo_ctrl_rxilvl_wd), |
| .de(hw2reg[31]), |
| .d(hw2reg[34-:3]), |
| .qe(reg2hw[30]), |
| .q(reg2hw[33-:3]), |
| .qs(fifo_ctrl_rxilvl_qs) |
| ); |
| prim_subreg #( |
| .DW(2), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(2'h0) |
| ) u_fifo_ctrl_txilvl( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(fifo_ctrl_txilvl_we), |
| .wd(fifo_ctrl_txilvl_wd), |
| .de(hw2reg[28]), |
| .d(hw2reg[30-:2]), |
| .qe(reg2hw[27]), |
| .q(reg2hw[29-:2]), |
| .qs(fifo_ctrl_txilvl_qs) |
| ); |
| prim_subreg_ext #(.DW(6)) u_fifo_status_txlvl( |
| .re(fifo_status_txlvl_re), |
| .we(1'b0), |
| .wd({6 {1'sb0}}), |
| .d(hw2reg[27-:6]), |
| .qre(), |
| .qe(), |
| .q(), |
| .qs(fifo_status_txlvl_qs) |
| ); |
| prim_subreg_ext #(.DW(6)) u_fifo_status_rxlvl( |
| .re(fifo_status_rxlvl_re), |
| .we(1'b0), |
| .wd({6 {1'sb0}}), |
| .d(hw2reg[21-:6]), |
| .qre(), |
| .qe(), |
| .q(), |
| .qs(fifo_status_rxlvl_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ovrd_txen( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ovrd_txen_we), |
| .wd(ovrd_txen_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[26]), |
| .qs(ovrd_txen_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_ovrd_txval( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(ovrd_txval_we), |
| .wd(ovrd_txval_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[25]), |
| .qs(ovrd_txval_qs) |
| ); |
| prim_subreg_ext #(.DW(16)) u_val( |
| .re(val_re), |
| .we(1'b0), |
| .wd({16 {1'sb0}}), |
| .d(hw2reg[15-:16]), |
| .qre(), |
| .qe(), |
| .q(), |
| .qs(val_qs) |
| ); |
| prim_subreg #( |
| .DW(24), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(24'h000000) |
| ) u_timeout_ctrl_val( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(timeout_ctrl_val_we), |
| .wd(timeout_ctrl_val_wd), |
| .de(1'b0), |
| .d({24 {1'sb0}}), |
| .qe(), |
| .q(reg2hw[24-:24]), |
| .qs(timeout_ctrl_val_qs) |
| ); |
| prim_subreg #( |
| .DW(1), |
| ._sv2v_width_SWACCESS(16), |
| .SWACCESS("RW"), |
| .RESVAL(1'h0) |
| ) u_timeout_ctrl_en( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .we(timeout_ctrl_en_we), |
| .wd(timeout_ctrl_en_wd), |
| .de(1'b0), |
| .d(1'sb0), |
| .qe(), |
| .q(reg2hw[-0]), |
| .qs(timeout_ctrl_en_qs) |
| ); |
| reg [11:0] addr_hit; |
| always @(*) begin |
| addr_hit = {12 {1'sb0}}; |
| addr_hit[0] = reg_addr == UART_INTR_STATE_OFFSET; |
| addr_hit[1] = reg_addr == UART_INTR_ENABLE_OFFSET; |
| addr_hit[2] = reg_addr == UART_INTR_TEST_OFFSET; |
| addr_hit[3] = reg_addr == UART_CTRL_OFFSET; |
| addr_hit[4] = reg_addr == UART_STATUS_OFFSET; |
| addr_hit[5] = reg_addr == UART_RDATA_OFFSET; |
| addr_hit[6] = reg_addr == UART_WDATA_OFFSET; |
| addr_hit[7] = reg_addr == UART_FIFO_CTRL_OFFSET; |
| addr_hit[8] = reg_addr == UART_FIFO_STATUS_OFFSET; |
| addr_hit[9] = reg_addr == UART_OVRD_OFFSET; |
| addr_hit[10] = reg_addr == UART_VAL_OFFSET; |
| addr_hit[11] = reg_addr == UART_TIMEOUT_CTRL_OFFSET; |
| end |
| assign addrmiss = (reg_re || reg_we ? ~|addr_hit : 1'b0); |
| always @(*) begin |
| wr_err = 1'b0; |
| if ((addr_hit[0] && reg_we) && (UART_PERMIT[44+:4] != (UART_PERMIT[44+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[1] && reg_we) && (UART_PERMIT[40+:4] != (UART_PERMIT[40+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[2] && reg_we) && (UART_PERMIT[36+:4] != (UART_PERMIT[36+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[3] && reg_we) && (UART_PERMIT[32+:4] != (UART_PERMIT[32+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[4] && reg_we) && (UART_PERMIT[28+:4] != (UART_PERMIT[28+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[5] && reg_we) && (UART_PERMIT[24+:4] != (UART_PERMIT[24+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[6] && reg_we) && (UART_PERMIT[20+:4] != (UART_PERMIT[20+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[7] && reg_we) && (UART_PERMIT[16+:4] != (UART_PERMIT[16+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[8] && reg_we) && (UART_PERMIT[12+:4] != (UART_PERMIT[12+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[9] && reg_we) && (UART_PERMIT[8+:4] != (UART_PERMIT[8+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[10] && reg_we) && (UART_PERMIT[4+:4] != (UART_PERMIT[4+:4] & reg_be))) |
| wr_err = 1'b1; |
| if ((addr_hit[11] && reg_we) && (UART_PERMIT[0+:4] != (UART_PERMIT[0+:4] & reg_be))) |
| wr_err = 1'b1; |
| end |
| assign intr_state_tx_watermark_we = (addr_hit[0] & reg_we) & ~wr_err; |
| assign intr_state_tx_watermark_wd = reg_wdata[0]; |
| assign intr_state_rx_watermark_we = (addr_hit[0] & reg_we) & ~wr_err; |
| assign intr_state_rx_watermark_wd = reg_wdata[1]; |
| assign intr_state_tx_empty_we = (addr_hit[0] & reg_we) & ~wr_err; |
| assign intr_state_tx_empty_wd = reg_wdata[2]; |
| assign intr_state_rx_overflow_we = (addr_hit[0] & reg_we) & ~wr_err; |
| assign intr_state_rx_overflow_wd = reg_wdata[3]; |
| assign intr_state_rx_frame_err_we = (addr_hit[0] & reg_we) & ~wr_err; |
| assign intr_state_rx_frame_err_wd = reg_wdata[4]; |
| assign intr_state_rx_break_err_we = (addr_hit[0] & reg_we) & ~wr_err; |
| assign intr_state_rx_break_err_wd = reg_wdata[5]; |
| assign intr_state_rx_timeout_we = (addr_hit[0] & reg_we) & ~wr_err; |
| assign intr_state_rx_timeout_wd = reg_wdata[6]; |
| assign intr_state_rx_parity_err_we = (addr_hit[0] & reg_we) & ~wr_err; |
| assign intr_state_rx_parity_err_wd = reg_wdata[7]; |
| assign intr_enable_tx_watermark_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign intr_enable_tx_watermark_wd = reg_wdata[0]; |
| assign intr_enable_rx_watermark_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign intr_enable_rx_watermark_wd = reg_wdata[1]; |
| assign intr_enable_tx_empty_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign intr_enable_tx_empty_wd = reg_wdata[2]; |
| assign intr_enable_rx_overflow_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign intr_enable_rx_overflow_wd = reg_wdata[3]; |
| assign intr_enable_rx_frame_err_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign intr_enable_rx_frame_err_wd = reg_wdata[4]; |
| assign intr_enable_rx_break_err_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign intr_enable_rx_break_err_wd = reg_wdata[5]; |
| assign intr_enable_rx_timeout_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign intr_enable_rx_timeout_wd = reg_wdata[6]; |
| assign intr_enable_rx_parity_err_we = (addr_hit[1] & reg_we) & ~wr_err; |
| assign intr_enable_rx_parity_err_wd = reg_wdata[7]; |
| assign intr_test_tx_watermark_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign intr_test_tx_watermark_wd = reg_wdata[0]; |
| assign intr_test_rx_watermark_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign intr_test_rx_watermark_wd = reg_wdata[1]; |
| assign intr_test_tx_empty_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign intr_test_tx_empty_wd = reg_wdata[2]; |
| assign intr_test_rx_overflow_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign intr_test_rx_overflow_wd = reg_wdata[3]; |
| assign intr_test_rx_frame_err_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign intr_test_rx_frame_err_wd = reg_wdata[4]; |
| assign intr_test_rx_break_err_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign intr_test_rx_break_err_wd = reg_wdata[5]; |
| assign intr_test_rx_timeout_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign intr_test_rx_timeout_wd = reg_wdata[6]; |
| assign intr_test_rx_parity_err_we = (addr_hit[2] & reg_we) & ~wr_err; |
| assign intr_test_rx_parity_err_wd = reg_wdata[7]; |
| assign ctrl_tx_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign ctrl_tx_wd = reg_wdata[0]; |
| assign ctrl_rx_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign ctrl_rx_wd = reg_wdata[1]; |
| assign ctrl_nf_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign ctrl_nf_wd = reg_wdata[2]; |
| assign ctrl_slpbk_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign ctrl_slpbk_wd = reg_wdata[4]; |
| assign ctrl_llpbk_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign ctrl_llpbk_wd = reg_wdata[5]; |
| assign ctrl_parity_en_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign ctrl_parity_en_wd = reg_wdata[6]; |
| assign ctrl_parity_odd_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign ctrl_parity_odd_wd = reg_wdata[7]; |
| assign ctrl_rxblvl_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign ctrl_rxblvl_wd = reg_wdata[9:8]; |
| assign ctrl_nco_we = (addr_hit[3] & reg_we) & ~wr_err; |
| assign ctrl_nco_wd = reg_wdata[31:16]; |
| assign status_txfull_re = addr_hit[4] && reg_re; |
| assign status_rxfull_re = addr_hit[4] && reg_re; |
| assign status_txempty_re = addr_hit[4] && reg_re; |
| assign status_txidle_re = addr_hit[4] && reg_re; |
| assign status_rxidle_re = addr_hit[4] && reg_re; |
| assign status_rxempty_re = addr_hit[4] && reg_re; |
| assign rdata_re = addr_hit[5] && reg_re; |
| assign wdata_we = (addr_hit[6] & reg_we) & ~wr_err; |
| assign wdata_wd = reg_wdata[7:0]; |
| assign fifo_ctrl_rxrst_we = (addr_hit[7] & reg_we) & ~wr_err; |
| assign fifo_ctrl_rxrst_wd = reg_wdata[0]; |
| assign fifo_ctrl_txrst_we = (addr_hit[7] & reg_we) & ~wr_err; |
| assign fifo_ctrl_txrst_wd = reg_wdata[1]; |
| assign fifo_ctrl_rxilvl_we = (addr_hit[7] & reg_we) & ~wr_err; |
| assign fifo_ctrl_rxilvl_wd = reg_wdata[4:2]; |
| assign fifo_ctrl_txilvl_we = (addr_hit[7] & reg_we) & ~wr_err; |
| assign fifo_ctrl_txilvl_wd = reg_wdata[6:5]; |
| assign fifo_status_txlvl_re = addr_hit[8] && reg_re; |
| assign fifo_status_rxlvl_re = addr_hit[8] && reg_re; |
| assign ovrd_txen_we = (addr_hit[9] & reg_we) & ~wr_err; |
| assign ovrd_txen_wd = reg_wdata[0]; |
| assign ovrd_txval_we = (addr_hit[9] & reg_we) & ~wr_err; |
| assign ovrd_txval_wd = reg_wdata[1]; |
| assign val_re = addr_hit[10] && reg_re; |
| assign timeout_ctrl_val_we = (addr_hit[11] & reg_we) & ~wr_err; |
| assign timeout_ctrl_val_wd = reg_wdata[23:0]; |
| assign timeout_ctrl_en_we = (addr_hit[11] & reg_we) & ~wr_err; |
| assign timeout_ctrl_en_wd = reg_wdata[31]; |
| always @(*) begin |
| reg_rdata_next = {DW {1'sb0}}; |
| case (1'b1) |
| addr_hit[0]: begin |
| reg_rdata_next[0] = intr_state_tx_watermark_qs; |
| reg_rdata_next[1] = intr_state_rx_watermark_qs; |
| reg_rdata_next[2] = intr_state_tx_empty_qs; |
| reg_rdata_next[3] = intr_state_rx_overflow_qs; |
| reg_rdata_next[4] = intr_state_rx_frame_err_qs; |
| reg_rdata_next[5] = intr_state_rx_break_err_qs; |
| reg_rdata_next[6] = intr_state_rx_timeout_qs; |
| reg_rdata_next[7] = intr_state_rx_parity_err_qs; |
| end |
| addr_hit[1]: begin |
| reg_rdata_next[0] = intr_enable_tx_watermark_qs; |
| reg_rdata_next[1] = intr_enable_rx_watermark_qs; |
| reg_rdata_next[2] = intr_enable_tx_empty_qs; |
| reg_rdata_next[3] = intr_enable_rx_overflow_qs; |
| reg_rdata_next[4] = intr_enable_rx_frame_err_qs; |
| reg_rdata_next[5] = intr_enable_rx_break_err_qs; |
| reg_rdata_next[6] = intr_enable_rx_timeout_qs; |
| reg_rdata_next[7] = intr_enable_rx_parity_err_qs; |
| end |
| addr_hit[2]: begin |
| reg_rdata_next[0] = 1'sb0; |
| reg_rdata_next[1] = 1'sb0; |
| reg_rdata_next[2] = 1'sb0; |
| reg_rdata_next[3] = 1'sb0; |
| reg_rdata_next[4] = 1'sb0; |
| reg_rdata_next[5] = 1'sb0; |
| reg_rdata_next[6] = 1'sb0; |
| reg_rdata_next[7] = 1'sb0; |
| end |
| addr_hit[3]: begin |
| reg_rdata_next[0] = ctrl_tx_qs; |
| reg_rdata_next[1] = ctrl_rx_qs; |
| reg_rdata_next[2] = ctrl_nf_qs; |
| reg_rdata_next[4] = ctrl_slpbk_qs; |
| reg_rdata_next[5] = ctrl_llpbk_qs; |
| reg_rdata_next[6] = ctrl_parity_en_qs; |
| reg_rdata_next[7] = ctrl_parity_odd_qs; |
| reg_rdata_next[9:8] = ctrl_rxblvl_qs; |
| reg_rdata_next[31:16] = ctrl_nco_qs; |
| end |
| addr_hit[4]: begin |
| reg_rdata_next[0] = status_txfull_qs; |
| reg_rdata_next[1] = status_rxfull_qs; |
| reg_rdata_next[2] = status_txempty_qs; |
| reg_rdata_next[3] = status_txidle_qs; |
| reg_rdata_next[4] = status_rxidle_qs; |
| reg_rdata_next[5] = status_rxempty_qs; |
| end |
| addr_hit[5]: reg_rdata_next[7:0] = rdata_qs; |
| addr_hit[6]: reg_rdata_next[7:0] = {8 {1'sb0}}; |
| addr_hit[7]: begin |
| reg_rdata_next[0] = 1'sb0; |
| reg_rdata_next[1] = 1'sb0; |
| reg_rdata_next[4:2] = fifo_ctrl_rxilvl_qs; |
| reg_rdata_next[6:5] = fifo_ctrl_txilvl_qs; |
| end |
| addr_hit[8]: begin |
| reg_rdata_next[5:0] = fifo_status_txlvl_qs; |
| reg_rdata_next[21:16] = fifo_status_rxlvl_qs; |
| end |
| addr_hit[9]: begin |
| reg_rdata_next[0] = ovrd_txen_qs; |
| reg_rdata_next[1] = ovrd_txval_qs; |
| end |
| addr_hit[10]: reg_rdata_next[15:0] = val_qs; |
| addr_hit[11]: begin |
| reg_rdata_next[23:0] = timeout_ctrl_val_qs; |
| reg_rdata_next[31] = timeout_ctrl_en_qs; |
| end |
| default: reg_rdata_next = {DW {1'sb1}}; |
| endcase |
| end |
| endmodule |
| module uart_rx ( |
| clk_i, |
| rst_ni, |
| rx_enable, |
| tick_baud_x16, |
| parity_enable, |
| parity_odd, |
| tick_baud, |
| rx_valid, |
| rx_data, |
| idle, |
| frame_err, |
| rx_parity_err, |
| rx |
| ); |
| input clk_i; |
| input rst_ni; |
| input rx_enable; |
| input tick_baud_x16; |
| input parity_enable; |
| input parity_odd; |
| output wire tick_baud; |
| output wire rx_valid; |
| output [7:0] rx_data; |
| output wire idle; |
| output frame_err; |
| output rx_parity_err; |
| input rx; |
| reg rx_valid_q; |
| reg [10:0] sreg_q; |
| reg [10:0] sreg_d; |
| reg [3:0] bit_cnt_q; |
| reg [3:0] bit_cnt_d; |
| reg [3:0] baud_div_q; |
| reg [3:0] baud_div_d; |
| reg tick_baud_d; |
| reg tick_baud_q; |
| reg idle_d; |
| reg idle_q; |
| assign tick_baud = tick_baud_q; |
| assign idle = idle_q; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| sreg_q <= 11'h000; |
| bit_cnt_q <= 4'h0; |
| baud_div_q <= 4'h0; |
| tick_baud_q <= 1'b0; |
| idle_q <= 1'b1; |
| end |
| else begin |
| sreg_q <= sreg_d; |
| bit_cnt_q <= bit_cnt_d; |
| baud_div_q <= baud_div_d; |
| tick_baud_q <= tick_baud_d; |
| idle_q <= idle_d; |
| end |
| always @(*) |
| if (!rx_enable) begin |
| sreg_d = 11'h000; |
| bit_cnt_d = 4'h0; |
| baud_div_d = 4'h0; |
| tick_baud_d = 1'b0; |
| idle_d = 1'b1; |
| end |
| else begin |
| tick_baud_d = 1'b0; |
| sreg_d = sreg_q; |
| bit_cnt_d = bit_cnt_q; |
| baud_div_d = baud_div_q; |
| idle_d = idle_q; |
| if (tick_baud_x16) |
| {tick_baud_d, baud_div_d} = {1'b0, baud_div_q} + 5'h01; |
| if (idle_q && !rx) begin |
| baud_div_d = 4'd8; |
| tick_baud_d = 1'b0; |
| bit_cnt_d = (parity_enable ? 4'd11 : 4'd10); |
| sreg_d = 11'h000; |
| idle_d = 1'b0; |
| end |
| else if (!idle_q && tick_baud_q) |
| if ((bit_cnt_q == (parity_enable ? 4'd11 : 4'd10)) && rx) begin |
| idle_d = 1'b1; |
| bit_cnt_d = 4'h0; |
| end |
| else begin |
| sreg_d = {rx, sreg_q[10:1]}; |
| bit_cnt_d = bit_cnt_q - 4'h1; |
| idle_d = bit_cnt_q == 4'h1; |
| end |
| end |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) |
| rx_valid_q <= 1'b0; |
| else |
| rx_valid_q <= tick_baud_q & (bit_cnt_q == 4'h1); |
| assign rx_valid = rx_valid_q; |
| assign rx_data = (parity_enable ? sreg_q[8:1] : sreg_q[9:2]); |
| assign frame_err = rx_valid_q & ~sreg_q[10]; |
| assign rx_parity_err = (parity_enable & rx_valid_q) & ^{sreg_q[9:1], parity_odd}; |
| endmodule |
| module uart_tx ( |
| clk_i, |
| rst_ni, |
| tx_enable, |
| tick_baud_x16, |
| parity_enable, |
| wr, |
| wr_parity, |
| wr_data, |
| idle, |
| tx |
| ); |
| input clk_i; |
| input rst_ni; |
| input tx_enable; |
| input tick_baud_x16; |
| input wire parity_enable; |
| input wr; |
| input wire wr_parity; |
| input [7:0] wr_data; |
| output idle; |
| output wire tx; |
| reg [3:0] baud_div_q; |
| reg tick_baud_q; |
| reg [3:0] bit_cnt_q; |
| reg [3:0] bit_cnt_d; |
| reg [10:0] sreg_q; |
| reg [10:0] sreg_d; |
| reg tx_q; |
| reg tx_d; |
| assign tx = tx_q; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| baud_div_q <= 4'h0; |
| tick_baud_q <= 1'b0; |
| end |
| else if (tick_baud_x16) |
| {tick_baud_q, baud_div_q} <= {1'b0, baud_div_q} + 5'h01; |
| else |
| tick_baud_q <= 1'b0; |
| always @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| bit_cnt_q <= 4'h0; |
| sreg_q <= 11'h7ff; |
| tx_q <= 1'b1; |
| end |
| else begin |
| bit_cnt_q <= bit_cnt_d; |
| sreg_q <= sreg_d; |
| tx_q <= tx_d; |
| end |
| always @(*) |
| if (!tx_enable) begin |
| bit_cnt_d = 4'h0; |
| sreg_d = 11'h7ff; |
| tx_d = 1'b1; |
| end |
| else begin |
| bit_cnt_d = bit_cnt_q; |
| sreg_d = sreg_q; |
| tx_d = tx_q; |
| if (wr) begin |
| sreg_d = {1'b1, (parity_enable ? wr_parity : 1'b1), wr_data, 1'b0}; |
| bit_cnt_d = (parity_enable ? 4'd11 : 4'd10); |
| end |
| else if (tick_baud_q && (bit_cnt_q != 4'h0)) begin |
| sreg_d = {1'b1, sreg_q[10:1]}; |
| tx_d = sreg_q[0]; |
| bit_cnt_d = bit_cnt_q - 4'h1; |
| end |
| end |
| assign idle = (tx_enable ? bit_cnt_q == 4'h0 : 1'b1); |
| endmodule |