diff --git a/flist/IP/CG092_cache.flist b/flist/IP/CG092_cache.flist new file mode 100644 index 0000000000000000000000000000000000000000..4b2f4111a0867277c459afba8f15a1bf32a17157 --- /dev/null +++ b/flist/IP/CG092_cache.flist @@ -0,0 +1,18 @@ + +// ============= Verilog library extensions =========== ++libext+.v+.vlib + ++incdir+/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/CG092-BU-50000-r2p0-00rel0/p_flash_cache_f0/logical/p_flash_cache_f0/verilog + +/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/CG092-BU-50000-r2p0-00rel0/p_flash_cache_f0/logical/p_flash_cache_f0/verilog/p_flash_cache_f0_bus_logic.v +/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/CG092-BU-50000-r2p0-00rel0/p_flash_cache_f0/logical/p_flash_cache_f0/verilog/p_flash_cache_f0_mrb.v +/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/CG092-BU-50000-r2p0-00rel0/p_flash_cache_f0/logical/p_flash_cache_f0/verilog/p_flash_cache_f0_core.v +/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/CG092-BU-50000-r2p0-00rel0/p_flash_cache_f0/logical/p_flash_cache_f0/verilog/p_flash_cache_f0.v +/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/CG092-BU-50000-r2p0-00rel0/p_flash_cache_f0/logical/p_flash_cache_f0/verilog/p_flash_cache_f0_reg_block.v + +/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/CG092-BU-50000-r2p0-00rel0/p_flash_cache_f0/logical/models/cells/generic/p_flash_cache_f0_capt_sync.v +/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/CG092-BU-50000-r2p0-00rel0/p_flash_cache_f0/logical/models/cells/generic/cdc_capt_sync.v + +/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/CG092-BU-50000-r2p0-00rel0/p_flash_cache_f0/logical/models/modules/generic/p_flash_cache_f0_static_reg.v +/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/CG092-BU-50000-r2p0-00rel0/p_flash_cache_f0/logical/models/modules/generic/static_reg.v + diff --git a/flist/Top/ahb_QSPI.flist b/flist/Top/ahb_QSPI.flist index d074bdd80180da80554021956c1f1b10d37fceb6..22bf7722fa7e0f8e6f6de1f38d6f8d5271fc5d7f 100644 --- a/flist/Top/ahb_QSPI.flist +++ b/flist/Top/ahb_QSPI.flist @@ -1,3 +1,10 @@ -$(SOCLABS_AHB_QSPI_DIR)/logical/top_ahb_qspi/logical/top_ahb_qspi.v \ No newline at end of file +$(SOCLABS_AHB_QSPI_DIR)/logical/top_ahb_qspi/logical/top_ahb_qspi.sv +$(SOCLABS_AHB_QSPI_DIR)/logical/apb_qspi_regs/logical/apb_qspi_regs.sv +$(SOCLABS_AHB_QSPI_DIR)/logical/ahb_qspi_interface/logical/ahb_qspi_interface.sv + +$(SOCLABS_AHB_QSPI_DIR)/logical/qspi_controller/logical/qspi_controller.sv + +$(SOCLABS_AHB_QSPI_DIR)/logical/cache_subsytem/logical/cache_subsystem.v +-f $(SOCLABS_AHB_QSPI_DIR)/flist/IP/CG092_cache.flist \ No newline at end of file diff --git a/flist/Top/ahb_QSPI_SIM.flist b/flist/Top/ahb_QSPI_SIM.flist new file mode 100644 index 0000000000000000000000000000000000000000..0f86644da7991f3dc4d7ea983542a66cfcb6515d --- /dev/null +++ b/flist/Top/ahb_QSPI_SIM.flist @@ -0,0 +1,2 @@ +-f $(SOCLABS_AHB_QSPI_DIR)/flist/Top/ahb_QSPI.flist +-f $(SOCLABS_AHB_QSPI_DIR)/flist/VIP/ahb_QSPI_VIP.flist \ No newline at end of file diff --git a/flist/VIP/ahb_QSPI_VIP.flist b/flist/VIP/ahb_QSPI_VIP.flist new file mode 100644 index 0000000000000000000000000000000000000000..48e3be0459b65ca926e65a15740bdce4bde78134 --- /dev/null +++ b/flist/VIP/ahb_QSPI_VIP.flist @@ -0,0 +1 @@ +/Users/danielnewbrook/Documents/SoCLabs/AAA/ip_dir/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_apb/verilog/cmsdk_ahb_to_apb.v diff --git a/flows/makefile.simulate b/flows/makefile.simulate index e33807974be0331827cfc3d0f0acf7138bc2e571..cd94ed81e7dca38eaa42454f11053c9966cc390b 100644 --- a/flows/makefile.simulate +++ b/flows/makefile.simulate @@ -20,6 +20,8 @@ else ifeq ($(SIMULATOR),xm) COCOTB_SIMULATOR := xcelium else ifeq ($(SIMULATOR),vcs) COCOTB_SIMULATOR := vcs +else ifeq ($(SIMULATOR), icarus) + COCOTB_SIMULATOR := icarus endif # Cocotb GUI Variable diff --git a/logical/ahb_qspi_interface/logical/ahb_qspi_interface.sv b/logical/ahb_qspi_interface/logical/ahb_qspi_interface.sv new file mode 100644 index 0000000000000000000000000000000000000000..06d3391027a0b8fe5c7ea9f380d1f807aee4c1d0 --- /dev/null +++ b/logical/ahb_qspi_interface/logical/ahb_qspi_interface.sv @@ -0,0 +1,77 @@ + +module ahb_qspi_interface #( + parameter ADDR_W = 32, + parameter DATA_W = 32 + )( + input wire HCLK, + input wire HRESETn, + + // AHB Signals + input wire [ADDR_W-1:0] HADDR, + input wire [1:0] HTRANS, + input wire HWRITE, + input wire [2:0] HSIZE, + input wire [2:0] HBURST, + input wire [3:0] HPROT, + input wire [DATA_W-1:0] HWDATA, + input wire HSELx, + output wire [DATA_W-1:0] HRDATA, + input wire HREADY, + output wire HREADYOUT, + output wire HRESP +); + +assign HREADYOUT = 1'b0; +assign HRESP = 1'b0; +// AHB FSM +enum {IDLE, WAIT_READ, WAIT_WRITE, WRITE, READ} current_state, next_state; + +// AHB lite last regs +reg last_HSEL; +reg [31:0] last_HADDR; +reg last_HWRITE; +reg [1:0] last_HTRANS; + +// +reg qspi_ready; + +always @(posedge HCLK or negedge HRESETn) begin + if(~HRESETn) begin + last_HSEL <= 1'b0; + last_HADDR <= 32'd0; + last_HWRITE <= 1'b0; + last_HTRANS <= 2'b00; + + current_state <= IDLE; + qspi_ready <= 1'b0; + end else begin + last_HSEL <= HSELx; + last_HADDR <= HADDR; + last_HWRITE <= HWRITE; + last_HTRANS <= HTRANS; + + current_state <= next_state; + end +end + +always @(*) begin + next_state = IDLE; + case(current_state) + IDLE: if(HSELx & HWRITE & ~qspi_ready) + next_state = WAIT_WRITE; + else if(HSELx & ~qspi_ready) + next_state = WAIT_READ; + WAIT_WRITE: if(qspi_ready) + next_state = WRITE; + else + next_state = WAIT_WRITE; + WAIT_READ: if(qspi_ready) + next_state = READ; + else + next_state = WAIT_READ; + READ: next_state = IDLE; + WRITE: next_state = IDLE; + endcase +end + +endmodule \ No newline at end of file diff --git a/logical/apb_qspi_regs/logical/apb_qspi_regs.sv b/logical/apb_qspi_regs/logical/apb_qspi_regs.sv new file mode 100644 index 0000000000000000000000000000000000000000..42db5380241649f4b27220dd02b7bd5f5fe21a70 --- /dev/null +++ b/logical/apb_qspi_regs/logical/apb_qspi_regs.sv @@ -0,0 +1,48 @@ + +module apb_qspi_regs( + // APB Signals + input wire PCLK, + input wire PRESETn, + input wire [11:2] PADDR, + input wire [2:0] PPROT, + input wire PSEL, + input wire PENABLE, + input wire PWRITE, + input wire [31:0] PWDATA, + input wire [3:0] PSTRB, + output reg [31:0] PRDATA, + output wire PREADY, + output wire PSLVERR +); +// Registers +reg [31:0] reg0; +reg [31:0] reg1; + + +always @(posedge PCLK or negedge PRESETn) begin + if(~PRESETn) begin + reg0 = 32'd0; + reg1 = 32'd0; + end else begin + if(PSEL & PENABLE & PWRITE) begin + case(PADDR) + 10'h000: reg0 = PWDATA; + 10'h001: reg1 = PWDATA; + endcase + end + end +end + +always @(PCLK, PADDR) begin + if(PCLK) begin + case(PADDR) + 10'h000: PRDATA = reg0; + 10'h001: PRDATA = reg1; + endcase + end +end + +assign PREADY = 1'b1; //(PSEL & PENABLE & PWRITE) | (PSEL & ~PWRITE); +assign PSLVERR = 1'b0; + +endmodule \ No newline at end of file diff --git a/logical/cache_subsytem/logical/cache_subsystem.v b/logical/cache_subsytem/logical/cache_subsystem.v new file mode 100644 index 0000000000000000000000000000000000000000..1ee51d1c1214bcdb80d584508deeb56189d77e20 --- /dev/null +++ b/logical/cache_subsytem/logical/cache_subsystem.v @@ -0,0 +1,146 @@ +module cache_subsystem( + input wire HCLK, + input wire HRESETn, + + // APB + input wire PCLKG, + input wire [11:0] PADDR, + input wire [31:0] PWDATA, + input wire PWRITE, + input wire PSEL, + input wire PENABLE, + input wire [3:0] PSTRB, + input wire [2:0] PPROT, + output wire [31:0] PRDATA, + output wire PSLVERR, + output wire PREADY, + + // AHB Subordinate + input wire HSELS, // Device select + input wire [21:0] HADDRS, // Address + input wire [2:0] HBURSTS, // Burst Type - Not used! + input wire HMASTLOCKS, // Master Lock - Not used! + input wire [1:0] HTRANSS, // Transfer control + input wire [2:0] HSIZES, // Transfer size + input wire [3:0] HPROTS, // Transfer Protection + input wire HWRITES, // Write control + input wire [31:0] HWDATAS, // Write data + input wire HREADYS, // Transfer phase done + input wire HMASTERS, // When 1 indicate a debug access + output wire HREADYOUTS, // Device ready + output wire [31:0] HRDATAS, // Read data output + output wire HRESPS, + + // AHB Manager + output wire HSELM, // Device select + output wire [21:0] HADDRM, // Address + output wire [2:0] HBURSTM, // Burst Type - Not used (tied to 0)! + output wire HMASTLOCKM, // Master Lock - Not used (tied to 0)! + output wire [1:0] HTRANSM, // Transfer control + output wire [2:0] HSIZEM, // Transfer size + output wire [3:0] HPROTM, // Transfer Protection + output wire HWRITEM, // Write control + output wire [127:0] HWDATAM, // Write data + output wire HREADYM, // Transfer phase done + input wire HREADYOUTM, // Device ready + input wire [127:0] HRDATAM, // Read data output + input wire HRESPM, // Error response + + output wire IRQ, + output wire CACHEMISS, + output wire CACHEHIT +); + + + +p_flash_cache_f0 #( + .AW(22), + .CW(12), + .CACHE_WAY(2), + .RESET_ALL_REGS(0), + .GEN_STAT_LOGIC(1), + .LINEW(4) + ) u_cache_controller( + .HCLK(HCLK), + .HRESETn(HRESETn), + // APB Interface + .PCLKG(PCLKG), + .PADDR(PADDR), + .PWDATA(PWDATA), + .PWRITE(PWRITE), + .PSEL(PSEL), + .PENABLE(PENABLE), + .PSTRB(PSTRB), + .PPROT(PPROT), + .PRDATA(PRDATA), + .PSLVERR(PSLVERR), + .PREADY(PREADY), + // AHB Subordinate + .HSELS(HSELS), + .HADDRS(HADDRS), + .HBURSTS(HBURSTS), + .HMASTLOCKS(HMASTLOCKS), + .HTRANSS(HTRANSS), + .HSIZES(HSIZES), + .HPROTS(HPROTS), + .HWRITES(HWRITES), + .HWDATAS(HWDATAS), + .HREADYS(HREADYS), + .HMASTERS(HMASTERS), + .HREADYOUTS(HREADYOUTS), + .HRDATAS(HRDATAS), + .HRESPS(HRESPS), + // CACHE RAM POWER UP + .RAMPWRUPREQ(), + .RAMPWRUPACK(), + // TAG RAM way 0 + .RAMTAG0ADDR(), + .RAMTAG0WE(), + .RAMTAG0RD(), + .RAMTAG0CS(), + .RAMTAG0WDATA(), + .RAMTAG0RDATA(), + // Data RAM way 0 + .RAMCLD0ADDR(), + .RAMCLD0WE(), + .RAMCLD0RD(), + .RAMCLD0CS(), + .RAMCLD0WDATA(), + .RAMCLD0RDATA(), + // TAG RAM way 1 + .RAMTAG1ADDR(), + .RAMTAG1WE(), + .RAMTAG1RD(), + .RAMTAG1CS(), + .RAMTAG1WDATA(), + .RAMTAG1RDATA(), + // Data RAM Way 1 + .RAMCLD1ADDR(), + .RAMCLD1WE(), + .RAMCLD1RD(), + .RAMCLD1CS(), + .RAMCLD1WDATA(), + .RAMCLD1RDATA(), + // AHB Manager + .HSELM(HSELM), + .HADDRM(HADDRM), + .HBURSTM(HBURSTM), + .HMASTLOCKM(HMASTLOCKM), + .HTRANSM(HTRANSM), + .HSIZEM(HSIZEM), + .HPROTM(HPROTM), + .HWRITEM(HWRITEM), + .HWDATAM(HWDATAM), + .HREADYM(HREADYM), + .HREADYOUTM(HREADYOUTM), + .HRDATAM(HRDATAM), + .HRESPM(HRESPM), + + .IRQ(IRQ), + + .CACHEMISS(CACHEMISS), + .CACHEHIT(CACHEHIT) +); + + +endmodule \ No newline at end of file diff --git a/logical/qspi_controller/logical/qspi_controller.sv b/logical/qspi_controller/logical/qspi_controller.sv new file mode 100644 index 0000000000000000000000000000000000000000..d435d5ccc84113ace31a6b42ee264357c3293d3f --- /dev/null +++ b/logical/qspi_controller/logical/qspi_controller.sv @@ -0,0 +1,46 @@ + +module qspi_controller ( + input wire HCLK, + input wire HRESETn, + + input wire [7:0] QSPI_CLK_DIV, + input wire [1:0] QSPI_SPI_MODE, // {CPOL, CPHA} + + input wire [7:0] QSPI_CMD, + input wire [23:0] QSPI_ADDR, + input wire [31:0] QSPI_WDATA, + output wire [31:0] QSPI_RDATA, + + // QSPI Interface + output wire QSPI_SCLK +); + +reg [7:0] QSPI_CLK_DIV_COUNTER; +wire QSPI_ACTIVE; +reg QSPI_SCLK_reg; +assign QSPI_ACTIVE = 1'b1; + +assign QSPI_SCLK = (QSPI_CLK_DIV==8'h00) ? HCLK : QSPI_SCLK_reg; +// Clock Divider for SCLK +always @(posedge HCLK or negedge HRESETn) begin + if(~HRESETn) begin + QSPI_CLK_DIV_COUNTER<=8'h00; + QSPI_SCLK_reg <= 1'b0; + end else begin + if(QSPI_ACTIVE) begin + if(QSPI_CLK_DIV!=8'h00) begin + if(QSPI_CLK_DIV_COUNTER==QSPI_CLK_DIV-1'b1) begin + QSPI_CLK_DIV_COUNTER <= 8'h00; + end else begin + QSPI_SCLK_reg <= ~QSPI_SCLK_reg; + QSPI_CLK_DIV_COUNTER <= QSPI_CLK_DIV_COUNTER + 1'b1; + end + end else begin + QSPI_SCLK_reg <= QSPI_SPI_MODE[1]; + end + end else begin + QSPI_SCLK_reg <= QSPI_SPI_MODE[1]; + end + end +end +endmodule \ No newline at end of file diff --git a/logical/top_ahb_qspi/logical/top_ahb_qspi.sv b/logical/top_ahb_qspi/logical/top_ahb_qspi.sv new file mode 100644 index 0000000000000000000000000000000000000000..802ebc46b96786a4fc30328a27c61a8505d7cb57 --- /dev/null +++ b/logical/top_ahb_qspi/logical/top_ahb_qspi.sv @@ -0,0 +1,96 @@ + + +module top_ahb_qspi #( + parameter ADDR_W = 32, + parameter DATA_W = 32 + )( + input wire HCLK, + input wire HRESETn, + input wire PCLK, + input wire PRESETn, + // AHB Signals + input wire [ADDR_W-1:0] HADDR, + input wire [1:0] HTRANS, + input wire HWRITE, + input wire [2:0] HSIZE, + input wire [2:0] HBURST, + input wire [3:0] HPROT, + input wire [DATA_W-1:0] HWDATA, + input wire HSELx, + output wire [DATA_W-1:0] HRDATA, + input wire HREADY, + output wire HREADYOUT, + output wire HRESP, + + // APB Signals + input wire [11:2] PADDR, + input wire [2:0] PPROT, + input wire PSEL, + input wire PENABLE, + input wire PWRITE, + input wire [31:0] PWDATA, + input wire [3:0] PSTRB, + output wire [31:0] PRDATA, + output wire PREADY, + output wire PSLVERR, + + // QSPI Signals + output wire QSPI_SCLK, + output wire QSPI_nCS, + output wire [3:0] QSPI_IO_o, + input wire [3:0] QSPI_IO_i, + output wire [3:0] QSPI_IO_e +); + +cache_subsystem u_cache_subsystem( + +); + +apb_qspi_regs u_apb_qspi_regs( + .PCLK(PCLK), + .PRESETn(PRESETn), + .PADDR(PADDR), + .PPROT(PPROT), + .PSEL(PSEL), + .PENABLE(PENABLE), + .PWRITE(PWRITE), + .PWDATA(PWDATA), + .PSTRB(PSTRB), + .PRDATA(PRDATA), + .PREADY(PREADY), + .PSLVERR(PSLVERR) +); + +ahb_qspi_interface #( + .ADDR_W(ADDR_W), + .DATA_W(DATA_W) + ) u_ahb_qspi_interface ( + .HCLK(HCLK), + .HRESETn(HRESETn), + .HADDR(HADDR), + .HTRANS(HTRANS), + .HWRITE(HWRITE), + .HSIZE(HSIZE), + .HBURST(HBURST), + .HPROT(HPROT), + .HWDATA(HWDATA), + .HSELx(HSELx), + .HRDATA(HRDATA), + .HREADY(HREADY), + .HREADYOUT(HREADYOUT), + .HRESP(HRESP) +); + +qspi_controller u_qspi_controller( + .HCLK(HCLK), + .HRESETn(HRESETn), + .QSPI_CLK_DIV(8'h02), + .QSPI_SPI_MODE(2'b11), + .QSPI_CMD(), + .QSPI_ADDR(), + .QSPI_WDATA(), + .QSPI_RDATA(), + + .QSPI_SCLK(QSPI_SCLK) +); +endmodule \ No newline at end of file diff --git a/logical/top_ahb_qspi/logical/top_ahb_qspi.v b/logical/top_ahb_qspi/logical/top_ahb_qspi.v deleted file mode 100644 index 9cc4e4c7ff97375692f12eea24cb0faf15ff6f5f..0000000000000000000000000000000000000000 --- a/logical/top_ahb_qspi/logical/top_ahb_qspi.v +++ /dev/null @@ -1,33 +0,0 @@ - - -module top_ahb_qspi #( - parameter ADDR_W = 16, - parameter DATA_W = 32 - )( - input wire HCLK, - input wire HRESETn, - - // AHB Signals - input wire [ADDR_W-1:0] HADDR, - input wire [1:0] HTRANS, - input wire HWRITE, - input wire [2:0] HSIZE, - input wire [2:0] HBURST, - input wire [3:0] HPROT, - input wire [DATA_W-1:0] HWDATA, - input wire HSELx, - output wire [DATA_W-1:0] HRDATA, - input wire HREADY, - output wire HREADYOUT, - output wire HRESP, - - // QSPI Signals - output wire QSPI_SCLK, - output wire QSPI_nCS, - output wire [3:0] QSPI_IO_o, - input wire [3:0] QSPI_IO_i, - output wire [3:0] QSPI_IO_e -); - - -endmodule \ No newline at end of file diff --git a/make.cfg b/make.cfg new file mode 100644 index 0000000000000000000000000000000000000000..73728989feaf1ab102ebe2df4fef61d057164d14 --- /dev/null +++ b/make.cfg @@ -0,0 +1 @@ +BP210_DIR ?= \ No newline at end of file diff --git a/makefile b/makefile index 2ad6e3b7354b3be145465c9ae65a985be6a2a302..a5d2d64a0e3c1f96bc5fa5bcb681e377d80df189 100644 --- a/makefile +++ b/makefile @@ -1,3 +1,5 @@ +include $(SOCLABS_AHB_QSPI_DIR)/make.cfg + #------------------------------------- # - Commonly Overloaded Variables #------------------------------------- @@ -15,8 +17,10 @@ SIM_DIR ?= $(SIM_TOP_DIR) ifeq ($(ASIC),yes) DESIGN_VC ?= $(SOCLABS_AHB_QSPI_DIR)/flist/Top/ahb_QSPI_ASIC.flist else - DESIGN_VC ?= $(SOCLABS_AHB_QSPI_DIR)/flist/Top/ahb_QSPI.flist + DESIGN_VC ?= $(SOCLABS_AHB_QSPI_DIR)/flist/Top/ahb_QSPI_SIM.flist endif #Include flows include ./flows/makefile.simulate + +export BP210_DIR \ No newline at end of file diff --git a/verif/cocotb/ahb_qspi_cocotb.v b/verif/cocotb/ahb_qspi_cocotb.v index 2ee7bb2f9dc559554e6e1cc4f5987606a8a1dda3..a9877e04299ef4d03814af084b5b88332d14f68d 100644 --- a/verif/cocotb/ahb_qspi_cocotb.v +++ b/verif/cocotb/ahb_qspi_cocotb.v @@ -5,38 +5,115 @@ module ahb_qspi_cocotb( input wire HRESETn, // AHB Signals - input wire [32-1:0] cocotb_HADDR, - input wire [1:0] cocotb_HTRANS, - input wire cocotb_HWRITE, - input wire [2:0] cocotb_HSIZE, - input wire [2:0] cocotb_HBURST, - input wire [3:0] cocotb_HPROT, - input wire [32-1:0] cocotb_HWDATA, - input wire cocotb_HSELx, - output wire [32-1:0] cocotb_HRDATA, - input wire cocotb_HREADY, - output wire cocotb_HREADYOUT, - output wire cocotb_HRESP + input wire [32-1:0] config_HADDR, + input wire [1:0] config_HTRANS, + input wire config_HWRITE, + input wire [2:0] config_HSIZE, + input wire [2:0] config_HBURST, + input wire [3:0] config_HPROT, + input wire [32-1:0] config_HWDATA, + input wire config_HSEL, + output wire [32-1:0] config_HRDATA, + input wire config_HREADY_IN, + output wire config_HREADY, + output wire config_HRESP, + + input wire [32-1:0] data_HADDR, + input wire [1:0] data_HTRANS, + input wire data_HWRITE, + input wire [2:0] data_HSIZE, + input wire [2:0] data_HBURST, + input wire [3:0] data_HPROT, + input wire [32-1:0] data_HWDATA, + input wire data_HSEL, + output wire [32-1:0] data_HRDATA, + input wire data_HREADY_IN, + output wire data_HREADY, + output wire data_HRESP ); +initial +begin + $dumpfile("ahb_qspi.vcd"); + $dumpvars; +end -top_ahb_qspi u_top_ahb_qspi( + +wire [11:0] PADDR; +wire [2:0] PPROT; +wire PSEL; +wire PENABLE; +wire PWRITE; +wire [31:0] PWDATA; +wire [3:0] PSTRB; +wire [31:0] PRDATA; +wire PREADY; +wire PSLVERR; + +cmsdk_ahb_to_apb #( + .ADDRWIDTH(12), + .REGISTER_RDATA(1), + .REGISTER_WDATA(0) +) u_cmsdk_ahb_to_apb ( .HCLK(HCLK), .HRESETn(HRESETn), + .PCLKEN(1'b1), + + .HSEL(config_HSEL), + .HADDR(config_HADDR[11:0]), + .HTRANS(config_HTRANS), + .HSIZE(config_HSIZE), + .HPROT(config_HPROT), + .HWRITE(config_HWRITE), + .HREADY(config_HREADY_IN), + .HWDATA(config_HWDATA), + + .HREADYOUT(config_HREADY), + .HRDATA(config_HRDATA), + .HRESP(config_HRESP), - .HADDR(cocotb_HADDR), - .HTRANS(cocotb_HTRANS), - .HWRITE(cocotb_HWRITE), - .HSIZE(cocotb_HSIZE), - .HBURST(cocotb_HBURST), - .HPROT(cocotb_HPROT), - .HWDATA(cocotb_HWDATA), - .HSELx(cocotb_HSELx), - .HRDATA(cocotb_HRDATA), - .HREADY(cocotb_HREADY), - .HREADYOUT(cocotb_HREADYOUT), - .HRESP(cocotb_HRESP), + .PADDR(PADDR), + .PENABLE(PENABLE), + .PWRITE(PWRITE), + .PSTRB(PSTRB), + .PPROT(PPROT), + .PWDATA(PWDATA), + .PSEL(PSEL), + .APBACTIVE(), + .PRDATA(PRDATA), + .PREADY(PREADY), + .PSLVERR(PSLVERR) +); + +top_ahb_qspi u_top_ahb_qspi( + .HCLK(HCLK), + .HRESETn(HRESETn), + .PCLK(HCLK), + .PRESETn(HRESETn), + .HADDR(data_HADDR), + .HTRANS(data_HTRANS), + .HWRITE(data_HWRITE), + .HSIZE(data_HSIZE), + .HBURST(data_HBURST), + .HPROT(data_HPROT), + .HWDATA(data_HWDATA), + .HSELx(data_HSEL), + .HRDATA(data_HRDATA), + .HREADY(data_HREADY), + .HREADYOUT(data_HREADY), + .HRESP(data_HRESP), + + .PADDR(PADDR[11:2]), + .PPROT(PPROT), + .PSEL(PSEL), + .PENABLE(PENABLE), + .PWRITE(PWRITE), + .PWDATA(PWDATA), + .PSTRB(PSTRB), + .PRDATA(PRDATA), + .PREADY(PREADY), + .PSLVERR(PSLVERR), .QSPI_SCLK(), .QSPI_nCS(), .QSPI_IO_o(), diff --git a/verif/cocotb/ahb_qspi_tests.py b/verif/cocotb/ahb_qspi_tests.py index 98eb80a8ca833df63e8533bc56feaffeabff2bec..57a26de4b9325c7f376c3e0e94d87bbeb216b18b 100644 --- a/verif/cocotb/ahb_qspi_tests.py +++ b/verif/cocotb/ahb_qspi_tests.py @@ -11,15 +11,21 @@ from cocotb.regression import TestFactory from cocotbext.ahb import AHBLiteMaster, AHBBus +FREQ = 240 + +CONFIG_ADDR = 0x0 +DATA_ADDR = 0x10000000 + class TB: def __init__(self,dut): self.dut = dut self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) + cocotb.start_soon(Clock(dut.HCLK, 4.166, units="ns").start()) + self.config_ahb_master = AHBLiteMaster(AHBBus.from_prefix(dut,"config", optional_signals = {"hsel":"HSEL", "hready_in":"HREADY_IN", "hburst":"HBURST", "hprot":"HPROT"}), dut.HCLK, dut.HRESETn) + self.data_ahb_master = AHBLiteMaster(AHBBus.from_prefix(dut,"data", optional_signals = {"hsel":"HSEL", "hready_in":"HREADY_IN", "hburst":"HBURST", "hprot":"HPROT"}), dut.HCLK, dut.HRESETn) - cocotb.start_soon(Clock(dut.HCLK, 10, units="ns").start()) - self.ahb_master = AHBLiteMaster(AHBBus.from_prefix(dut,"cocotb"), dut.HCLK, dut.HRESETn) async def cycle_reset(self): self.dut.HRESETn.setimmediatevalue(0) await ClockCycles(self.dut.HCLK,20) @@ -31,4 +37,13 @@ async def AHB_QSPI_1(dut): tb = TB(dut) await tb.cycle_reset() - await tb.ahb_master.write(0x00,0x15) \ No newline at end of file + await tb.config_ahb_master.write(0x00,0xBEEFBEEF) + await tb.config_ahb_master.write(0x04,0xCAFECAFE) + await ClockCycles(dut.HCLK,2) + data = await tb.config_ahb_master.read(0x00,4) + await ClockCycles(dut.HCLK,2) + print(data) + data = await tb.config_ahb_master.read(0x00,4) + print(data) + data = await tb.config_ahb_master.read(0x04,4) + assert int(data[0]['data'],16) == 0xcafecafe