From 970c6fddcad4e30cb9c8f848bbbe1bd7f41c3f3e Mon Sep 17 00:00:00 2001 From: Olof Kindgren Date: Mon, 29 Jan 2024 22:28:05 +0100 Subject: [PATCH] Use Servile as a base for servant --- bench/servant_sim.v | 4 +- doc/servant.png | Bin 43366 -> 8953 bytes servant.core | 3 +- servant/servant.v | 248 ++++++++++++++------------------------ servant/servant_arbiter.v | 39 ------ servant/servant_mux.v | 44 +------ 6 files changed, 98 insertions(+), 240 deletions(-) delete mode 100644 servant/servant_arbiter.v diff --git a/bench/servant_sim.v b/bench/servant_sim.v index a21de05..c5e2f65 100644 --- a/bench/servant_sim.v +++ b/bench/servant_sim.v @@ -28,7 +28,7 @@ module servant_sim .align (align[0:0])) dut(wb_clk, wb_rst, q); - assign pc_adr = dut.wb_ibus_adr; - assign pc_vld = dut.wb_ibus_ack; + assign pc_adr = dut.wb_mem_adr; + assign pc_vld = dut.wb_mem_ack; endmodule diff --git a/doc/servant.png b/doc/servant.png index bf55ddbd85e11a90c3a0bd386712cdb3fe367a2b..61b192809bf4cc0c4582d945e9b88d65abec9b7b 100644 GIT binary patch literal 8953 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 AhX4Qo literal 43366 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
XXUNV+y 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�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 diff --git a/servant.core b/servant.core index ec12977..3909c8f 100644 --- a/servant.core +++ b/servant.core @@ -30,13 +30,12 @@ filesets: files: - servant/servant_timer.v - servant/servant_gpio.v - - servant/servant_arbiter.v - servant/servant_mux.v - "tool_quartus? (servant/servant_ram_quartus.sv)" : {file_type : systemVerilogSource} - "!tool_quartus? (servant/servant_ram.v)" - servant/servant.v file_type : verilogSource - depend : [serv, "mdu? (mdu)"] + depend : [servile, "mdu? (mdu)"] verilator_tb: files: diff --git a/servant/servant.v b/servant/servant.v index 0db9531..0ced369 100644 --- a/servant/servant.v +++ b/servant/servant.v @@ -13,103 +13,75 @@ module servant parameter [0:0] compress = 0; parameter [0:0] align = compress; + +`ifdef MDU + localparam [0:0] with_mdu = 1'b1; +`else + localparam [0:0] with_mdu = 1'b0; +`endif + + localparam aw = $clog2(memsize); + localparam csr_regs = with_csr*4; + + localparam rf_width = 2; + localparam rf_l2d = $clog2((32+csr_regs)*32/rf_width); + wire timer_irq; - wire [31:0] wb_ibus_adr; - wire wb_ibus_cyc; - wire [31:0] wb_ibus_rdt; - wire wb_ibus_ack; - - wire [31:0] wb_dbus_adr; - wire [31:0] wb_dbus_dat; - wire [3:0] wb_dbus_sel; - wire wb_dbus_we; - wire wb_dbus_cyc; - wire [31:0] wb_dbus_rdt; - wire wb_dbus_ack; - - wire [31:0] wb_dmem_adr; - wire [31:0] wb_dmem_dat; - wire [3:0] wb_dmem_sel; - wire wb_dmem_we; - wire wb_dmem_cyc; - wire [31:0] wb_dmem_rdt; - wire wb_dmem_ack; wire [31:0] wb_mem_adr; wire [31:0] wb_mem_dat; wire [3:0] wb_mem_sel; wire wb_mem_we; - wire wb_mem_cyc; + wire wb_mem_stb; wire [31:0] wb_mem_rdt; wire wb_mem_ack; wire wb_gpio_dat; wire wb_gpio_we; - wire wb_gpio_cyc; + wire wb_gpio_stb; wire wb_gpio_rdt; wire [31:0] wb_timer_dat; wire wb_timer_we; - wire wb_timer_cyc; + wire wb_timer_stb; wire [31:0] wb_timer_rdt; - wire [31:0] mdu_rs1; - wire [31:0] mdu_rs2; - wire [ 2:0] mdu_op; - wire mdu_valid; - wire [31:0] mdu_rd; - wire mdu_ready; + wire [31:0] wb_ext_adr; + wire [31:0] wb_ext_dat; + wire [3:0] wb_ext_sel; + wire wb_ext_we; + wire wb_ext_stb; + wire [31:0] wb_ext_rdt; + wire wb_ext_ack; - servant_arbiter arbiter - (.i_wb_cpu_dbus_adr (wb_dmem_adr), - .i_wb_cpu_dbus_dat (wb_dmem_dat), - .i_wb_cpu_dbus_sel (wb_dmem_sel), - .i_wb_cpu_dbus_we (wb_dmem_we ), - .i_wb_cpu_dbus_cyc (wb_dmem_cyc), - .o_wb_cpu_dbus_rdt (wb_dmem_rdt), - .o_wb_cpu_dbus_ack (wb_dmem_ack), + wire [rf_l2d-1:0] rf_waddr; + wire [rf_width-1:0] rf_wdata; + wire rf_wen; + wire [rf_l2d-1:0] rf_raddr; + wire rf_ren; + wire [rf_width-1:0] rf_rdata; - .i_wb_cpu_ibus_adr (wb_ibus_adr), - .i_wb_cpu_ibus_cyc (wb_ibus_cyc), - .o_wb_cpu_ibus_rdt (wb_ibus_rdt), - .o_wb_cpu_ibus_ack (wb_ibus_ack), - - .o_wb_cpu_adr (wb_mem_adr), - .o_wb_cpu_dat (wb_mem_dat), - .o_wb_cpu_sel (wb_mem_sel), - .o_wb_cpu_we (wb_mem_we ), - .o_wb_cpu_cyc (wb_mem_cyc), - .i_wb_cpu_rdt (wb_mem_rdt), - .i_wb_cpu_ack (wb_mem_ack)); - - servant_mux #(sim) servant_mux + servant_mux servant_mux ( .i_clk (wb_clk), .i_rst (wb_rst & (reset_strategy != "NONE")), - .i_wb_cpu_adr (wb_dbus_adr), - .i_wb_cpu_dat (wb_dbus_dat), - .i_wb_cpu_sel (wb_dbus_sel), - .i_wb_cpu_we (wb_dbus_we), - .i_wb_cpu_cyc (wb_dbus_cyc), - .o_wb_cpu_rdt (wb_dbus_rdt), - .o_wb_cpu_ack (wb_dbus_ack), - - .o_wb_mem_adr (wb_dmem_adr), - .o_wb_mem_dat (wb_dmem_dat), - .o_wb_mem_sel (wb_dmem_sel), - .o_wb_mem_we (wb_dmem_we), - .o_wb_mem_cyc (wb_dmem_cyc), - .i_wb_mem_rdt (wb_dmem_rdt), + .i_wb_cpu_adr (wb_ext_adr), + .i_wb_cpu_dat (wb_ext_dat), + .i_wb_cpu_sel (wb_ext_sel), + .i_wb_cpu_we (wb_ext_we), + .i_wb_cpu_cyc (wb_ext_stb), + .o_wb_cpu_rdt (wb_ext_rdt), + .o_wb_cpu_ack (wb_ext_ack), .o_wb_gpio_dat (wb_gpio_dat), .o_wb_gpio_we (wb_gpio_we), - .o_wb_gpio_cyc (wb_gpio_cyc), + .o_wb_gpio_cyc (wb_gpio_stb), .i_wb_gpio_rdt (wb_gpio_rdt), .o_wb_timer_dat (wb_timer_dat), .o_wb_timer_we (wb_timer_we), - .o_wb_timer_cyc (wb_timer_cyc), + .o_wb_timer_cyc (wb_timer_stb), .i_wb_timer_rdt (wb_timer_rdt)); servant_ram @@ -121,114 +93,78 @@ module servant .i_wb_clk (wb_clk), .i_wb_rst (wb_rst), .i_wb_adr (wb_mem_adr[$clog2(memsize)-1:2]), - .i_wb_cyc (wb_mem_cyc), + .i_wb_cyc (wb_mem_stb), .i_wb_we (wb_mem_we) , .i_wb_sel (wb_mem_sel), .i_wb_dat (wb_mem_dat), .o_wb_rdt (wb_mem_rdt), .o_wb_ack (wb_mem_ack)); - generate - if (|with_csr) begin - servant_timer - #(.RESET_STRATEGY (reset_strategy), - .WIDTH (32)) - timer - (.i_clk (wb_clk), - .i_rst (wb_rst), - .o_irq (timer_irq), - .i_wb_cyc (wb_timer_cyc), - .i_wb_we (wb_timer_we) , - .i_wb_dat (wb_timer_dat), - .o_wb_dat (wb_timer_rdt)); - end else begin - assign wb_timer_rdt = 32'd0; - assign timer_irq = 1'b0; - end - endgenerate + servant_timer + #(.RESET_STRATEGY (reset_strategy), + .WIDTH (32)) + timer + (.i_clk (wb_clk), + .i_rst (wb_rst), + .o_irq (timer_irq), + .i_wb_cyc (wb_timer_stb), + .i_wb_we (wb_timer_we) , + .i_wb_dat (wb_timer_dat), + .o_wb_dat (wb_timer_rdt)); servant_gpio gpio (.i_wb_clk (wb_clk), .i_wb_dat (wb_gpio_dat), .i_wb_we (wb_gpio_we), - .i_wb_cyc (wb_gpio_cyc), + .i_wb_cyc (wb_gpio_stb), .o_wb_rdt (wb_gpio_rdt), .o_gpio (q)); - serv_rf_top - #(.RESET_PC (32'h0000_0000), - .RESET_STRATEGY (reset_strategy), - `ifdef MDU - .MDU(1), - `endif - .WITH_CSR (with_csr), - .COMPRESSED(compress), - .ALIGN(align)) + serv_rf_ram + #(.width (rf_width), + .csr_regs (csr_regs)) + rf_ram + (.i_clk (wb_clk), + .i_waddr (rf_waddr), + .i_wdata (rf_wdata), + .i_wen (rf_wen), + .i_raddr (rf_raddr), + .i_ren (rf_ren), + .o_rdata (rf_rdata)); + + servile + #(.rf_width (rf_width), + .sim (sim[0]), + .with_c (compress[0]), + .with_csr (with_csr[0]), + .with_mdu (with_mdu)) cpu ( - .clk (wb_clk), - .i_rst (wb_rst), + .i_clk (wb_clk), + .i_rst (wb_rst), .i_timer_irq (timer_irq), -`ifdef RISCV_FORMAL - .rvfi_valid (), - .rvfi_order (), - .rvfi_insn (), - .rvfi_trap (), - .rvfi_halt (), - .rvfi_intr (), - .rvfi_mode (), - .rvfi_ixl (), - .rvfi_rs1_addr (), - .rvfi_rs2_addr (), - .rvfi_rs1_rdata (), - .rvfi_rs2_rdata (), - .rvfi_rd_addr (), - .rvfi_rd_wdata (), - .rvfi_pc_rdata (), - .rvfi_pc_wdata (), - .rvfi_mem_addr (), - .rvfi_mem_rmask (), - .rvfi_mem_wmask (), - .rvfi_mem_rdata (), - .rvfi_mem_wdata (), -`endif - .o_ibus_adr (wb_ibus_adr), - .o_ibus_cyc (wb_ibus_cyc), - .i_ibus_rdt (wb_ibus_rdt), - .i_ibus_ack (wb_ibus_ack), + .o_wb_mem_adr (wb_mem_adr), + .o_wb_mem_dat (wb_mem_dat), + .o_wb_mem_sel (wb_mem_sel), + .o_wb_mem_we (wb_mem_we), + .o_wb_mem_stb (wb_mem_stb), + .i_wb_mem_rdt (wb_mem_rdt), + .i_wb_mem_ack (wb_mem_ack), - .o_dbus_adr (wb_dbus_adr), - .o_dbus_dat (wb_dbus_dat), - .o_dbus_sel (wb_dbus_sel), - .o_dbus_we (wb_dbus_we), - .o_dbus_cyc (wb_dbus_cyc), - .i_dbus_rdt (wb_dbus_rdt), - .i_dbus_ack (wb_dbus_ack), + .o_wb_ext_adr (wb_ext_adr), + .o_wb_ext_dat (wb_ext_dat), + .o_wb_ext_sel (wb_ext_sel), + .o_wb_ext_we (wb_ext_we), + .o_wb_ext_stb (wb_ext_stb), + .i_wb_ext_rdt (wb_ext_rdt), + .i_wb_ext_ack (wb_ext_ack), - //Extension - .o_ext_rs1 (mdu_rs1), - .o_ext_rs2 (mdu_rs2), - .o_ext_funct3 (mdu_op), - .i_ext_rd (mdu_rd), - .i_ext_ready (mdu_ready), - //MDU - .o_mdu_valid (mdu_valid)); - -`ifdef MDU - mdu_top mdu_serv - ( - .i_clk(wb_clk), - .i_rst(wb_rst), - .i_mdu_rs1(mdu_rs1), - .i_mdu_rs2(mdu_rs2), - .i_mdu_op(mdu_op), - .i_mdu_valid(mdu_valid), - .o_mdu_ready(mdu_ready), - .o_mdu_rd(mdu_rd)); -`else - assign mdu_ready = 1'b0; - assign mdu_rd = 32'b0; -`endif + .o_rf_waddr (rf_waddr), + .o_rf_wdata (rf_wdata), + .o_rf_wen (rf_wen), + .o_rf_raddr (rf_raddr), + .o_rf_ren (rf_ren), + .i_rf_rdata (rf_rdata)); endmodule diff --git a/servant/servant_arbiter.v b/servant/servant_arbiter.v deleted file mode 100644 index 00b39c8..0000000 --- a/servant/servant_arbiter.v +++ /dev/null @@ -1,39 +0,0 @@ -/* Arbitrates between dbus and ibus accesses. - * Relies on the fact that not both masters are active at the same time - */ -module servant_arbiter - ( - input wire [31:0] i_wb_cpu_dbus_adr, - input wire [31:0] i_wb_cpu_dbus_dat, - input wire [3:0] i_wb_cpu_dbus_sel, - input wire i_wb_cpu_dbus_we, - input wire i_wb_cpu_dbus_cyc, - output wire [31:0] o_wb_cpu_dbus_rdt, - output wire o_wb_cpu_dbus_ack, - - input wire [31:0] i_wb_cpu_ibus_adr, - input wire i_wb_cpu_ibus_cyc, - output wire [31:0] o_wb_cpu_ibus_rdt, - output wire o_wb_cpu_ibus_ack, - - output wire [31:0] o_wb_cpu_adr, - output wire [31:0] o_wb_cpu_dat, - output wire [3:0] o_wb_cpu_sel, - output wire o_wb_cpu_we, - output wire o_wb_cpu_cyc, - input wire [31:0] i_wb_cpu_rdt, - input wire i_wb_cpu_ack); - - assign o_wb_cpu_dbus_rdt = i_wb_cpu_rdt; - assign o_wb_cpu_dbus_ack = i_wb_cpu_ack & !i_wb_cpu_ibus_cyc; - - assign o_wb_cpu_ibus_rdt = i_wb_cpu_rdt; - assign o_wb_cpu_ibus_ack = i_wb_cpu_ack & i_wb_cpu_ibus_cyc; - - assign o_wb_cpu_adr = i_wb_cpu_ibus_cyc ? i_wb_cpu_ibus_adr : i_wb_cpu_dbus_adr; - assign o_wb_cpu_dat = i_wb_cpu_dbus_dat; - assign o_wb_cpu_sel = i_wb_cpu_dbus_sel; - assign o_wb_cpu_we = i_wb_cpu_dbus_we & !i_wb_cpu_ibus_cyc; - assign o_wb_cpu_cyc = i_wb_cpu_ibus_cyc | i_wb_cpu_dbus_cyc; - -endmodule diff --git a/servant/servant_mux.v b/servant/servant_mux.v index 8c11eff..f92467b 100644 --- a/servant/servant_mux.v +++ b/servant/servant_mux.v @@ -16,13 +16,6 @@ module servant_mux output wire [31:0] o_wb_cpu_rdt, output reg o_wb_cpu_ack, - output wire [31:0] o_wb_mem_adr, - output wire [31:0] o_wb_mem_dat, - output wire [3:0] o_wb_mem_sel, - output wire o_wb_mem_we, - output wire o_wb_mem_cyc, - input wire [31:0] i_wb_mem_rdt, - output wire o_wb_gpio_dat, output wire o_wb_gpio_we, output wire o_wb_gpio_cyc, @@ -37,8 +30,8 @@ module servant_mux wire [1:0] s = i_wb_cpu_adr[31:30]; - assign o_wb_cpu_rdt = s[1] ? i_wb_timer_rdt : - s[0] ? {31'd0,i_wb_gpio_rdt} : i_wb_mem_rdt; + assign o_wb_cpu_rdt = s[1] ? i_wb_timer_rdt : {31'd0,i_wb_gpio_rdt}; + always @(posedge i_clk) begin o_wb_cpu_ack <= 1'b0; if (i_wb_cpu_cyc & !o_wb_cpu_ack) @@ -47,43 +40,12 @@ module servant_mux o_wb_cpu_ack <= 1'b0; end - assign o_wb_mem_adr = i_wb_cpu_adr; - assign o_wb_mem_dat = i_wb_cpu_dat; - assign o_wb_mem_sel = i_wb_cpu_sel; - assign o_wb_mem_we = i_wb_cpu_we; - assign o_wb_mem_cyc = i_wb_cpu_cyc & (s == 2'b00); - assign o_wb_gpio_dat = i_wb_cpu_dat[0]; assign o_wb_gpio_we = i_wb_cpu_we; - assign o_wb_gpio_cyc = i_wb_cpu_cyc & (s == 2'b01); + assign o_wb_gpio_cyc = i_wb_cpu_cyc & !s[1]; assign o_wb_timer_dat = i_wb_cpu_dat; assign o_wb_timer_we = i_wb_cpu_we; assign o_wb_timer_cyc = i_wb_cpu_cyc & s[1]; - generate - if (sim) begin - wire sig_en = (i_wb_cpu_adr[31:28] == 4'h8) & i_wb_cpu_cyc & o_wb_cpu_ack; - wire halt_en = (i_wb_cpu_adr[31:28] == 4'h9) & i_wb_cpu_cyc & o_wb_cpu_ack; - - reg [1023:0] signature_file; - integer f = 0; - - initial - /* verilator lint_off WIDTH */ - if ($value$plusargs("signature=%s", signature_file)) begin - $display("Writing signature to %0s", signature_file); - f = $fopen(signature_file, "w"); - end - /* verilator lint_on WIDTH */ - - always @(posedge i_clk) - if (sig_en & (f != 0)) - $fwrite(f, "%c", i_wb_cpu_dat[7:0]); - else if(halt_en) begin - $display("Test complete"); - $finish; - end - end - endgenerate endmodule