From 64ba272313f80f2992706d4302b9746fe5c9f5c4 Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Fri, 5 Dec 2025 21:48:37 +0100 Subject: [PATCH 01/17] First draft of new hwpe_ctrl_target with SystemRDL-based register interface description --- Bender.yml | 10 +- rtl/{ => deprecated}/hwpe_ctrl_regfile.sv | 0 rtl/{ => deprecated}/hwpe_ctrl_regfile_ff.sv | 0 .../hwpe_ctrl_regfile_latch.sv | 0 .../hwpe_ctrl_regfile_latch_test_wrap.sv | 0 rtl/{ => deprecated}/hwpe_ctrl_slave.sv | 0 rtl/hwpe_ctrl_target.rdl | 128 ++++++++++ rtl/hwpe_ctrl_target_wrap.sv | 231 ++++++++++++++++++ rtl/rdl.sh | 5 + 9 files changed, 369 insertions(+), 5 deletions(-) rename rtl/{ => deprecated}/hwpe_ctrl_regfile.sv (100%) rename rtl/{ => deprecated}/hwpe_ctrl_regfile_ff.sv (100%) rename rtl/{ => deprecated}/hwpe_ctrl_regfile_latch.sv (100%) rename rtl/{ => deprecated}/hwpe_ctrl_regfile_latch_test_wrap.sv (100%) rename rtl/{ => deprecated}/hwpe_ctrl_slave.sv (100%) create mode 100644 rtl/hwpe_ctrl_target.rdl create mode 100644 rtl/hwpe_ctrl_target_wrap.sv create mode 100755 rtl/rdl.sh diff --git a/Bender.yml b/Bender.yml index 5acef88..cc05050 100644 --- a/Bender.yml +++ b/Bender.yml @@ -17,13 +17,13 @@ sources: - rtl/hwpe_ctrl_package.sv - rtl/hwpe_ctrl_interfaces.sv # Level 1 - - rtl/hwpe_ctrl_regfile_ff.sv - - rtl/hwpe_ctrl_regfile_latch.sv + - rtl/deprecated/hwpe_ctrl_regfile_ff.sv + - rtl/deprecated/hwpe_ctrl_regfile_latch.sv - rtl/hwpe_ctrl_seq_mult.sv - rtl/hwpe_ctrl_uloop.sv # Level 2 - - rtl/hwpe_ctrl_regfile_latch_test_wrap.sv + - rtl/deprecated/hwpe_ctrl_regfile_latch_test_wrap.sv # Level 3 - - rtl/hwpe_ctrl_regfile.sv + - rtl/deprecated/hwpe_ctrl_regfile.sv # Level 4 - - rtl/hwpe_ctrl_slave.sv + - rtl/deprecated/hwpe_ctrl_slave.sv diff --git a/rtl/hwpe_ctrl_regfile.sv b/rtl/deprecated/hwpe_ctrl_regfile.sv similarity index 100% rename from rtl/hwpe_ctrl_regfile.sv rename to rtl/deprecated/hwpe_ctrl_regfile.sv diff --git a/rtl/hwpe_ctrl_regfile_ff.sv b/rtl/deprecated/hwpe_ctrl_regfile_ff.sv similarity index 100% rename from rtl/hwpe_ctrl_regfile_ff.sv rename to rtl/deprecated/hwpe_ctrl_regfile_ff.sv diff --git a/rtl/hwpe_ctrl_regfile_latch.sv b/rtl/deprecated/hwpe_ctrl_regfile_latch.sv similarity index 100% rename from rtl/hwpe_ctrl_regfile_latch.sv rename to rtl/deprecated/hwpe_ctrl_regfile_latch.sv diff --git a/rtl/hwpe_ctrl_regfile_latch_test_wrap.sv b/rtl/deprecated/hwpe_ctrl_regfile_latch_test_wrap.sv similarity index 100% rename from rtl/hwpe_ctrl_regfile_latch_test_wrap.sv rename to rtl/deprecated/hwpe_ctrl_regfile_latch_test_wrap.sv diff --git a/rtl/hwpe_ctrl_slave.sv b/rtl/deprecated/hwpe_ctrl_slave.sv similarity index 100% rename from rtl/hwpe_ctrl_slave.sv rename to rtl/deprecated/hwpe_ctrl_slave.sv diff --git a/rtl/hwpe_ctrl_target.rdl b/rtl/hwpe_ctrl_target.rdl new file mode 100644 index 0000000..6d019e2 --- /dev/null +++ b/rtl/hwpe_ctrl_target.rdl @@ -0,0 +1,128 @@ +/* + * hwpe_ctrl.rdl + * Francesco Conti + * + * Copyright (C) 2025 ETH Zurich, University of Bologna + * Copyright and related rights are licensed under the Solderpad Hardware + * License, Version 0.51 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law + * or agreed to in writing, software, hardware and materials distributed under + * this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + + /* + * This file contains a sample address map for a HWPE with mandatory registers + * (not to be changed) and sample job-independent and job-dependent registers. + */ + +addrmap hwpe_ctrl_target { + name = "HWPE Control port"; + desc = ""; + + // Mandatory COMMIT_TRIGGER register. Not to be updated inside HWPEs. + reg hwpe_commit_trigger { + field { + name = "reserved"; + desc = "Reserved."; + hw = r; + sw = r; + } r0[31:2] = 0; + field { + name = "commit_trigger"; + desc = "Write 0 to commit job & start execution, unlock controller; write `0x1` value to commit job & unlock controller without starting execution, which will be started when the next job is committed and triggered; write `0x2` value to trigger the current job queue without committing any new job."; + hw = r; + sw = w; + swacc = true; + } commit_trigger[1:0] = 0; + }; + // Mandatory ACQUIRE register. Not to be updated inside HWPEs. + reg hwpe_acquire { + field { + name = "acquire"; + desc = "On read starts a job offload, locks controller. Returns job ID."; + hw = w; + sw = r; + swacc = true; + } acquire[31:0] = 0; + }; + // Mandatory RESERVED register. Not to be updated inside HWPEs. + reg hwpe_reserved { + field { + name = "reserved"; + desc = "Reserved."; + hw = r; + sw = r; + } reserved[31:0] = 0; + }; + // Mandatory STATUS register. Not to be updated inside HWPEs. + reg hwpe_status { + field { + name = "status"; + desc = "Status of currently running job."; + hw = w; + sw = r; + } status0[31:0] = 0; + }; + // Mandatory RUNNING_JOB register. Not to be updated inside HWPEs. + reg hwpe_running_job { + field { + name = "reserved"; + desc = "Reserved."; + hw = r; + sw = r; + } r0[31:8] = 0; + field { + name = "running_job"; + desc = "Returns ID of currently running job if any job is running; otherwise, of the last job that has been run."; + hw = w; + sw = r; + } running_job[7:0] = 0; + }; + // Mandatory SOFT_CLEAR register. Not to be updated inside HWPEs. + reg hwpe_soft_clear { + field { + name = "reserved"; + desc = "Reserved."; + hw = r; + sw = r; + } r0[31:2] = 0; + field { + name = "soft_clear"; + desc = "Write `0x0` to clear the full status of the accelerator IP, including the register file; write `0x1` to clear the status of the accelerator IP, except for the register file; write `0x2` to clear only the register file."; + hw = r; + sw = w; + swacc = true; + } soft_clear[1:0] = 0; + }; + + // "mandatory" set of HWPE registers (CONTROL regs). Not to be updated inside HWPEs. + regfile hwpe_ctrl_target_intf { + hwpe_commit_trigger commit_trigger @ 0x00; + hwpe_acquire acquire @ 0x04; + hwpe_reserved reserved0 @ 0x08; + hwpe_status status @ 0x0c; + hwpe_running_job running_job @ 0x10; + hwpe_soft_clear soft_clear @ 0x14; + hwpe_reserved reserved1 @ 0x18; + hwpe_reserved reserved2 @ 0x1c; + }; + + // "generic" set of HWPE registers. Update inside HWPEs. + regfile hwpe_ctrl_generic { + hwpe_reserved rr; + }; + + // "job-dependent" set of HWPE registers. Update inside HWPEs. + regfile hwpe_ctrl_job_dependent { + hwpe_reserved rr; + }; + + // HWPE control address map. Update inside HWPEs + hwpe_ctrl_target_intf hwpe_ctrl @ 0x00; + hwpe_ctrl_generic hwpe_generic @ 0x20; + hwpe_ctrl_job_dependent hwpe_job_dep @ 0x40; + +}; diff --git a/rtl/hwpe_ctrl_target_wrap.sv b/rtl/hwpe_ctrl_target_wrap.sv new file mode 100644 index 0000000..10f4a95 --- /dev/null +++ b/rtl/hwpe_ctrl_target_wrap.sv @@ -0,0 +1,231 @@ +/* + * hwpe_ctrl_target_wrap.sv + * Francesco Conti + * + * Copyright (C) 2014-2025 ETH Zurich, University of Bologna + * Copyright and related rights are licensed under the Solderpad Hardware + * License, Version 0.51 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law + * or agreed to in writing, software, hardware and materials distributed under + * this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + + /* + * This module exposes a hwpe_ctrl_intf_periph target (slave) port like the + * deprecated `hwpe_ctrl_slave`. However, it differs from the previous module + * in that it exploits SystemRDL to generate a register file interface. + * This module instantiates `hwpe_ctrl_target`, which is generated out of + * a SystemRDL description. This repository contains a reference SystemRDL + * `hwpe_ctrl_target.rdl`. HWPEs must internalize this and modify the content to + * align with their required set of job-independent and job-dependent registers, + * without modifying the mandatory registers. + */ + +module hwpe_ctrl_target_wrap + import hwpe_ctrl_package::*; + import hwpe_ctrl_target_pkg::*; +#( + parameter int unsigned NB_CONTEXT = 2, + parameter int unsigned NB_CLEAR_CYCLES = 3 +) +( + input logic clk_i, + input logic rst_ni, + output logic clear_o, + + // peripheral interconnect side + hwpe_ctrl_intf_periph.slave target, + + // job triggeringm completion & status + output logic job_trigger_o, + input logic job_done_i, + input logic [31:0] job_status_i, + + // job-independent registers + output hwpe_ctrl_target__hwpe_ctrl_generic__out_t job_indep_regs_o, + + // job-dependent registers + output logic job_dep_regs_valid_o, + output hwpe_ctrl_target__hwpe_ctrl_job_dependent__out_t job_dep_regs_o +); + + // unroll periph interconnect signals into OBI + logic target_obi_req; + logic target_obi_gnt; + logic [4:0] target_obi_addr; + logic target_obi_we; + logic [3:0] target_obi_be; + logic [31:0] target_obi_wdata; + logic [ID_WIDTH-1:0] target_obi_aid; + logic target_obi_rvalid; + logic target_obi_rready; + logic [31:0] target_obi_rdata; + logic target_obi_err; + logic [ID_WIDTH-1:0] target_obi_rid; + + assign target_obi_req = target.req; + assign target.gnt = target_obi_gnt; + assign target_obi_addr = target.add; + assign target_obi_we = ~target.wen; + assign target_obi_be = target.be; + assign target_obi_wdata = target.data; + assign target_obi_aid = target.id; + assign target.r_data = target_obi_rdata; + assign target.r_valid = target_obi_rvalid; + assign target.r_id = target_obi_rid; + assign target_obi_rready = '1; + + // error codes for job offload + localparam logic [31:0] HWPE_CTRL_JOB_QUEUE_FULL_ERR_CODE = 32'hffff_ffff; + localparam logic [31:0] HWPE_CTRL_JOB_ACQUIRED_ERR_CODE = 32'hffff_fffe; + + // wrap -> register interface signals + hwpe_ctrl_target__in_t hwif_in; + + // register interface -> wrap signals + hwpe_ctrl_target__out_t hwif_out; + + // state of job offload procedure + typedef enum logic { IDLE, ACQUIRE } job_offload_state_t; + job_offload_state_t job_offload_state_d, job_offload_state_q; + + // current and next job ID + logic [7:0] job_id_d, job_id_q; + + // job commit signal + logic job_commit; + + // job queue control signals + logic job_fifo_full, job_fifo_empty; + + // internal clear signals + logic soft_clear_regfile_d, soft_clear_state_d; + logic [NB_CLEAR_CYCLES-1:0] soft_clear_regfile_q, soft_clear_state_q; + logic soft_clear_regfile_en, soft_clear_state_en; + + // SOFT_CLEAR register: + // clear regfile if SOFT_CLEAR[0] is 0, clear state if SOFT_CLEAR[1] is 0 + assign soft_clear_regfile_d = hwif_out.hwpe_ctrl.soft_clear.soft_clear.swacc & ~hwif_out.hwpe_ctrl.soft_clear.soft_clear.value[0]; + assign soft_clear_state_d = hwif_out.hwpe_ctrl.soft_clear.soft_clear.swacc & ~hwif_out.hwpe_ctrl.soft_clear.soft_clear.value[1]; + + // generate clear enables + assign soft_clear_regfile_en = soft_clear_regfile_d | (|soft_clear_regfile_q); + assign soft_clear_state_eb = soft_clear_state_d | (|soft_clear_state_q); + + // activate clear for NB_CLEAR_CYCLES cycles in case of a SOFT_CLEAR write + always_ff @(posedge clk_i or negedge rst_ni) + begin + if(~rst_ni) begin + soft_clear_regfile_q <= '0; + end + else if(soft_clear_regfile_en) begin + soft_clear_regfile_q[0] <= soft_clear_regfile_d; + for(int i=1; i Date: Fri, 5 Dec 2025 22:03:29 +0100 Subject: [PATCH 02/17] The 'wrapper' strategy would fail with multiple HWPEs in a system. Use hwpe_ctrl_target as companion --- ...pe_ctrl_target.rdl => hwpe_ctrl_regif.rdl} | 16 +-- ...trl_target_wrap.sv => hwpe_ctrl_target.sv} | 104 ++++++++---------- rtl/rdl.sh | 6 +- 3 files changed, 55 insertions(+), 71 deletions(-) rename rtl/{hwpe_ctrl_target.rdl => hwpe_ctrl_regif.rdl} (93%) rename rtl/{hwpe_ctrl_target_wrap.sv => hwpe_ctrl_target.sv} (75%) diff --git a/rtl/hwpe_ctrl_target.rdl b/rtl/hwpe_ctrl_regif.rdl similarity index 93% rename from rtl/hwpe_ctrl_target.rdl rename to rtl/hwpe_ctrl_regif.rdl index 6d019e2..e38cc5e 100644 --- a/rtl/hwpe_ctrl_target.rdl +++ b/rtl/hwpe_ctrl_regif.rdl @@ -1,5 +1,5 @@ /* - * hwpe_ctrl.rdl + * hwpe_ctrl_regif.rdl * Francesco Conti * * Copyright (C) 2025 ETH Zurich, University of Bologna @@ -18,7 +18,7 @@ * (not to be changed) and sample job-independent and job-dependent registers. */ -addrmap hwpe_ctrl_target { +addrmap hwpe_ctrl_regif { name = "HWPE Control port"; desc = ""; @@ -99,7 +99,7 @@ addrmap hwpe_ctrl_target { }; // "mandatory" set of HWPE registers (CONTROL regs). Not to be updated inside HWPEs. - regfile hwpe_ctrl_target_intf { + regfile hwpe_ctrl_mandatory { hwpe_commit_trigger commit_trigger @ 0x00; hwpe_acquire acquire @ 0x04; hwpe_reserved reserved0 @ 0x08; @@ -111,18 +111,18 @@ addrmap hwpe_ctrl_target { }; // "generic" set of HWPE registers. Update inside HWPEs. - regfile hwpe_ctrl_generic { + regfile hwpe_ctrl_job_indep { hwpe_reserved rr; }; // "job-dependent" set of HWPE registers. Update inside HWPEs. - regfile hwpe_ctrl_job_dependent { + regfile hwpe_ctrl_job_dep { hwpe_reserved rr; }; // HWPE control address map. Update inside HWPEs - hwpe_ctrl_target_intf hwpe_ctrl @ 0x00; - hwpe_ctrl_generic hwpe_generic @ 0x20; - hwpe_ctrl_job_dependent hwpe_job_dep @ 0x40; + hwpe_ctrl_mandatory hwpe_ctrl @ 0x00; + hwpe_ctrl_job_indep hwpe_generic @ 0x20; + hwpe_ctrl_job_dep hwpe_job_dep @ 0x40; }; diff --git a/rtl/hwpe_ctrl_target_wrap.sv b/rtl/hwpe_ctrl_target.sv similarity index 75% rename from rtl/hwpe_ctrl_target_wrap.sv rename to rtl/hwpe_ctrl_target.sv index 10f4a95..cce595d 100644 --- a/rtl/hwpe_ctrl_target_wrap.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -1,5 +1,5 @@ /* - * hwpe_ctrl_target_wrap.sv + * hwpe_ctrl_target.sv * Francesco Conti * * Copyright (C) 2014-2025 ETH Zurich, University of Bologna @@ -17,19 +17,24 @@ * This module exposes a hwpe_ctrl_intf_periph target (slave) port like the * deprecated `hwpe_ctrl_slave`. However, it differs from the previous module * in that it exploits SystemRDL to generate a register file interface. - * This module instantiates `hwpe_ctrl_target`, which is generated out of + * This module must be coupled with a register interface generated out of * a SystemRDL description. This repository contains a reference SystemRDL - * `hwpe_ctrl_target.rdl`. HWPEs must internalize this and modify the content to + * `hwpe_ctrl_regif.rdl` and a `rdl.sh` script to generate the register + * interface with PeakRDL. HWPEs must internalize this and modify the content to * align with their required set of job-independent and job-dependent registers, * without modifying the mandatory registers. + * Then, the `hwpe_ctrl_target` can be integrated by 1) overriding the parametric + * types `hwpe_ctrl_regif_in_t` and `hwpe_ctrl_regif_out_t`; 2) plugging the + * OBI interface signals; 3) plugging `hwif_in` and `hwif_out`. */ -module hwpe_ctrl_target_wrap +module hwpe_ctrl_target import hwpe_ctrl_package::*; - import hwpe_ctrl_target_pkg::*; #( parameter int unsigned NB_CONTEXT = 2, - parameter int unsigned NB_CLEAR_CYCLES = 3 + parameter int unsigned NB_CLEAR_CYCLES = 3, + parameter type hwpe_ctrl_regif_in_t = logic, // must be overridden! + parameter type hwpe_ctrl_regif_out_t = logic // must be overridden! ) ( input logic clk_i, @@ -49,45 +54,46 @@ module hwpe_ctrl_target_wrap // job-dependent registers output logic job_dep_regs_valid_o, - output hwpe_ctrl_target__hwpe_ctrl_job_dependent__out_t job_dep_regs_o + output hwpe_ctrl_target__hwpe_ctrl_job_dependent__out_t job_dep_regs_o, + + // OBI interface to target SystemRDL-generated register interface + output logic target_obi_req_o, + input logic target_obi_gnt_i, + output logic [4:0] target_obi_addr_o, + output logic target_obi_we_o, + output logic [3:0] target_obi_be_o, + output logic [31:0] target_obi_wdata_o, + output logic [ID_WIDTH-1:0] target_obi_aid_o, + input logic target_obi_rvalid_i, + output logic target_obi_rready_o, + input logic [31:0] target_obi_rdata_i, + input logic target_obi_err_i, + input logic [ID_WIDTH-1:0] target_obi_rid_i, + + // wrap -> register interface signals + input hwpe_ctrl_regif_in_t hwif_in, + + // register interface -> wrap signals + output hwpe_ctrl_regif_out_t hwif_out ); // unroll periph interconnect signals into OBI - logic target_obi_req; - logic target_obi_gnt; - logic [4:0] target_obi_addr; - logic target_obi_we; - logic [3:0] target_obi_be; - logic [31:0] target_obi_wdata; - logic [ID_WIDTH-1:0] target_obi_aid; - logic target_obi_rvalid; - logic target_obi_rready; - logic [31:0] target_obi_rdata; - logic target_obi_err; - logic [ID_WIDTH-1:0] target_obi_rid; - - assign target_obi_req = target.req; - assign target.gnt = target_obi_gnt; - assign target_obi_addr = target.add; - assign target_obi_we = ~target.wen; - assign target_obi_be = target.be; - assign target_obi_wdata = target.data; - assign target_obi_aid = target.id; - assign target.r_data = target_obi_rdata; - assign target.r_valid = target_obi_rvalid; - assign target.r_id = target_obi_rid; - assign target_obi_rready = '1; + assign target_obi_req_o = target.req; + assign target.gnt = target_obi_gnt_i; + assign target_obi_addr_o = target.add; + assign target_obi_we_o = ~target.wen; + assign target_obi_be_o = target.be; + assign target_obi_wdata_o = target.data; + assign target_obi_aid_o = target.id; + assign target.r_data = target_obi_rdata_i; + assign target.r_valid = target_obi_rvalid_i; + assign target.r_id = target_obi_rid_i; + assign target_obi_rready_o = '1; // error codes for job offload localparam logic [31:0] HWPE_CTRL_JOB_QUEUE_FULL_ERR_CODE = 32'hffff_ffff; localparam logic [31:0] HWPE_CTRL_JOB_ACQUIRED_ERR_CODE = 32'hffff_fffe; - // wrap -> register interface signals - hwpe_ctrl_target__in_t hwif_in; - - // register interface -> wrap signals - hwpe_ctrl_target__out_t hwif_out; - // state of job offload procedure typedef enum logic { IDLE, ACQUIRE } job_offload_state_t; job_offload_state_t job_offload_state_d, job_offload_state_q; @@ -186,28 +192,6 @@ module hwpe_ctrl_target_wrap // return the current job ID assign hwif_in.hwpe_ctrl.running_job.running_job.next = job_id_q; - // SystemRDL registers generated with PeakRDL (HWPE-specific) - hwpe_ctrl_target #( - .ID_WIDTH ( ID_WIDTH ) - ) ( - .clk ( clk_i ), - .arst_n ( rst_ni ), - .s_obi_req ( target_obi_req ), - .s_obi_gnt ( target_obi_gnt ), - .s_obi_addr ( target_obi_addr ), - .s_obi_we ( target_obi_we ), - .s_obi_be ( target_obi_be ), - .s_obi_wdata ( target_obi_wdata ), - .s_obi_aid ( target_obi_aid ), - .s_obi_rvalid ( target_obi_rvalid ), - .s_obi_rready ( target_obi_rready ), - .s_obi_rdata ( target_obi_rdata ), - .s_obi_err ( target_obi_err ), - .s_obi_rid ( target_obi_rid ), - .hwif_in ( hwif_in ), - .hwif_out ( hwif_out ) - ); - // queue for incoming jobs fifo_v3 #( .FALL_THROUGH ( 0 ), @@ -228,4 +212,4 @@ module hwpe_ctrl_target_wrap ); assign job_dep_regs_valid_o = ~job_fifo_empty; -endmodule // hwpe_ctrl_target_wrap +endmodule // hwpe_ctrl_target diff --git a/rtl/rdl.sh b/rtl/rdl.sh index e2a83ea..1df671c 100755 --- a/rtl/rdl.sh +++ b/rtl/rdl.sh @@ -1,5 +1,5 @@ #!/bin/bash -peakrdl regblock hwpe_ctrl_target.rdl -o rdl-example/ --cpuif obi-flat --default-reset arst_n --hwif-report -peakrdl html hwpe_ctrl_target.rdl -o rdl-example/html/ -peakrdl c-header hwpe_ctrl_target.rdl -o rdl-example/hwpe_ctrl_target.h +peakrdl regblock hwpe_ctrl_regif.rdl -o rdl-example/ --cpuif obi-flat --default-reset arst_n --hwif-report +peakrdl html hwpe_ctrl_regif.rdl -o rdl-example/html/ +peakrdl c-header hwpe_ctrl_regif.rdl -o rdl-example/hwpe_ctrl_target.h From eafd00584ffbef920fe7280814a4859e5b92e079 Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Fri, 5 Dec 2025 22:04:09 +0100 Subject: [PATCH 03/17] Add hwpe_ctrl_target to Bender.yml --- Bender.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Bender.yml b/Bender.yml index cc05050..474c8cc 100644 --- a/Bender.yml +++ b/Bender.yml @@ -21,6 +21,7 @@ sources: - rtl/deprecated/hwpe_ctrl_regfile_latch.sv - rtl/hwpe_ctrl_seq_mult.sv - rtl/hwpe_ctrl_uloop.sv + - rtl/hwpe_ctrl_target.sv # Level 2 - rtl/deprecated/hwpe_ctrl_regfile_latch_test_wrap.sv # Level 3 From 66dab76da08cba733196dc1c9b33ceca74c93ca0 Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Fri, 5 Dec 2025 22:11:08 +0100 Subject: [PATCH 04/17] Also job configs must be parametric types in target. --- rtl/hwpe_ctrl_target.sv | 56 +++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/rtl/hwpe_ctrl_target.sv b/rtl/hwpe_ctrl_target.sv index cce595d..70a1e99 100644 --- a/rtl/hwpe_ctrl_target.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -24,8 +24,8 @@ * align with their required set of job-independent and job-dependent registers, * without modifying the mandatory registers. * Then, the `hwpe_ctrl_target` can be integrated by 1) overriding the parametric - * types `hwpe_ctrl_regif_in_t` and `hwpe_ctrl_regif_out_t`; 2) plugging the - * OBI interface signals; 3) plugging `hwif_in` and `hwif_out`. + * types; 2) plugging the OBI interface signals; 3) plugging `hwif_in` and + * `hwif_out`. */ module hwpe_ctrl_target @@ -34,47 +34,49 @@ module hwpe_ctrl_target parameter int unsigned NB_CONTEXT = 2, parameter int unsigned NB_CLEAR_CYCLES = 3, parameter type hwpe_ctrl_regif_in_t = logic, // must be overridden! - parameter type hwpe_ctrl_regif_out_t = logic // must be overridden! + parameter type hwpe_ctrl_regif_out_t = logic, // must be overridden! + parameter type hwpe_ctrl_job_indep_t = logic, // must be overridden! + parameter type hwpe_ctrl_job_dep_t = logic, // must be overridden! ) ( - input logic clk_i, - input logic rst_ni, - output logic clear_o, + input logic clk_i, + input logic rst_ni, + output logic clear_o, // peripheral interconnect side - hwpe_ctrl_intf_periph.slave target, + hwpe_ctrl_intf_periph.slave target, // job triggeringm completion & status - output logic job_trigger_o, - input logic job_done_i, - input logic [31:0] job_status_i, + output logic job_trigger_o, + input logic job_done_i, + input logic [31:0] job_status_i, // job-independent registers - output hwpe_ctrl_target__hwpe_ctrl_generic__out_t job_indep_regs_o, + output hwpe_ctrl_job_indep_t job_indep_regs_o, // job-dependent registers - output logic job_dep_regs_valid_o, - output hwpe_ctrl_target__hwpe_ctrl_job_dependent__out_t job_dep_regs_o, + output logic job_dep_regs_valid_o, + output hwpe_ctrl_job_dep_t job_dep_regs_o, // OBI interface to target SystemRDL-generated register interface - output logic target_obi_req_o, - input logic target_obi_gnt_i, - output logic [4:0] target_obi_addr_o, - output logic target_obi_we_o, - output logic [3:0] target_obi_be_o, - output logic [31:0] target_obi_wdata_o, - output logic [ID_WIDTH-1:0] target_obi_aid_o, - input logic target_obi_rvalid_i, - output logic target_obi_rready_o, - input logic [31:0] target_obi_rdata_i, - input logic target_obi_err_i, - input logic [ID_WIDTH-1:0] target_obi_rid_i, + output logic target_obi_req_o, + input logic target_obi_gnt_i, + output logic [4:0] target_obi_addr_o, + output logic target_obi_we_o, + output logic [3:0] target_obi_be_o, + output logic [31:0] target_obi_wdata_o, + output logic [ID_WIDTH-1:0] target_obi_aid_o, + input logic target_obi_rvalid_i, + output logic target_obi_rready_o, + input logic [31:0] target_obi_rdata_i, + input logic target_obi_err_i, + input logic [ID_WIDTH-1:0] target_obi_rid_i, // wrap -> register interface signals - input hwpe_ctrl_regif_in_t hwif_in, + input hwpe_ctrl_regif_in_t hwif_in, // register interface -> wrap signals - output hwpe_ctrl_regif_out_t hwif_out + output hwpe_ctrl_regif_out_t hwif_out ); // unroll periph interconnect signals into OBI From 7c077b370da2385ecf7f6303804344a5f3d162c1 Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Fri, 5 Dec 2025 22:14:37 +0100 Subject: [PATCH 05/17] Fix syntax error --- rtl/hwpe_ctrl_target.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtl/hwpe_ctrl_target.sv b/rtl/hwpe_ctrl_target.sv index 70a1e99..d6c6339 100644 --- a/rtl/hwpe_ctrl_target.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -36,7 +36,7 @@ module hwpe_ctrl_target parameter type hwpe_ctrl_regif_in_t = logic, // must be overridden! parameter type hwpe_ctrl_regif_out_t = logic, // must be overridden! parameter type hwpe_ctrl_job_indep_t = logic, // must be overridden! - parameter type hwpe_ctrl_job_dep_t = logic, // must be overridden! + parameter type hwpe_ctrl_job_dep_t = logic // must be overridden! ) ( input logic clk_i, From c033556213e45527934194782d215b4c9603e754 Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Fri, 5 Dec 2025 22:15:15 +0100 Subject: [PATCH 06/17] Reintroduce erroneosuly removed ID_WIDTH --- rtl/hwpe_ctrl_target.sv | 1 + 1 file changed, 1 insertion(+) diff --git a/rtl/hwpe_ctrl_target.sv b/rtl/hwpe_ctrl_target.sv index d6c6339..18da800 100644 --- a/rtl/hwpe_ctrl_target.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -33,6 +33,7 @@ module hwpe_ctrl_target #( parameter int unsigned NB_CONTEXT = 2, parameter int unsigned NB_CLEAR_CYCLES = 3, + parameter int unsigned ID_WIDTH = 2, parameter type hwpe_ctrl_regif_in_t = logic, // must be overridden! parameter type hwpe_ctrl_regif_out_t = logic, // must be overridden! parameter type hwpe_ctrl_job_indep_t = logic, // must be overridden! From 6b54e3266e6c90688fa1b8244eb07ac252bd4210 Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Fri, 5 Dec 2025 22:15:50 +0100 Subject: [PATCH 07/17] Fix syntax error --- rtl/hwpe_ctrl_target.sv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtl/hwpe_ctrl_target.sv b/rtl/hwpe_ctrl_target.sv index 18da800..d63e890 100644 --- a/rtl/hwpe_ctrl_target.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -132,7 +132,7 @@ module hwpe_ctrl_target end else if(soft_clear_regfile_en) begin soft_clear_regfile_q[0] <= soft_clear_regfile_d; - for(int i=1; i Date: Fri, 5 Dec 2025 22:16:34 +0100 Subject: [PATCH 08/17] Propagate parametric type to job FIFO --- rtl/hwpe_ctrl_target.sv | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtl/hwpe_ctrl_target.sv b/rtl/hwpe_ctrl_target.sv index d63e890..5be470b 100644 --- a/rtl/hwpe_ctrl_target.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -197,9 +197,9 @@ module hwpe_ctrl_target // queue for incoming jobs fifo_v3 #( - .FALL_THROUGH ( 0 ), - .DEPTH ( NB_CONTEXT ), - .dtype ( hwpe_ctrl_target__hwpe_ctrl_job_dependent__out_t ) + .FALL_THROUGH ( 0 ), + .DEPTH ( NB_CONTEXT ), + .dtype ( hwpe_ctrl_job_dep_t ) ) i_job_fifo ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), From 280377c2f3b7c9708c65c6b3218af1be2b5f9ebe Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Fri, 5 Dec 2025 22:19:15 +0100 Subject: [PATCH 09/17] make the example nature of hwpe_ctrl_regif_example more explicit! --- rtl/{hwpe_ctrl_regif.rdl => hwpe_ctrl_regif_example.rdl} | 4 ++-- rtl/rdl.sh | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename rtl/{hwpe_ctrl_regif.rdl => hwpe_ctrl_regif_example.rdl} (98%) diff --git a/rtl/hwpe_ctrl_regif.rdl b/rtl/hwpe_ctrl_regif_example.rdl similarity index 98% rename from rtl/hwpe_ctrl_regif.rdl rename to rtl/hwpe_ctrl_regif_example.rdl index e38cc5e..0688754 100644 --- a/rtl/hwpe_ctrl_regif.rdl +++ b/rtl/hwpe_ctrl_regif_example.rdl @@ -1,5 +1,5 @@ /* - * hwpe_ctrl_regif.rdl + * hwpe_ctrl_regif_example.rdl * Francesco Conti * * Copyright (C) 2025 ETH Zurich, University of Bologna @@ -18,7 +18,7 @@ * (not to be changed) and sample job-independent and job-dependent registers. */ -addrmap hwpe_ctrl_regif { +addrmap hwpe_ctrl_regif_example { name = "HWPE Control port"; desc = ""; diff --git a/rtl/rdl.sh b/rtl/rdl.sh index 1df671c..a1782c5 100755 --- a/rtl/rdl.sh +++ b/rtl/rdl.sh @@ -1,5 +1,5 @@ #!/bin/bash -peakrdl regblock hwpe_ctrl_regif.rdl -o rdl-example/ --cpuif obi-flat --default-reset arst_n --hwif-report -peakrdl html hwpe_ctrl_regif.rdl -o rdl-example/html/ -peakrdl c-header hwpe_ctrl_regif.rdl -o rdl-example/hwpe_ctrl_target.h +peakrdl regblock hwpe_ctrl_regif_example.rdl -o rdl-example/ --cpuif obi-flat --default-reset arst_n --hwif-report +peakrdl html hwpe_ctrl_regif_example.rdl -o rdl-example/html/ +peakrdl c-header hwpe_ctrl_regif_example.rdl -o rdl-example/hwpe_ctrl_target.h From cc316c1fd414526805dd8825f441b6cb0463c98d Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Sat, 6 Dec 2025 23:56:19 +0100 Subject: [PATCH 10/17] A few fixes --- rtl/hwpe_ctrl_target.sv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtl/hwpe_ctrl_target.sv b/rtl/hwpe_ctrl_target.sv index 5be470b..a3bc8fc 100644 --- a/rtl/hwpe_ctrl_target.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -47,7 +47,7 @@ module hwpe_ctrl_target // peripheral interconnect side hwpe_ctrl_intf_periph.slave target, - // job triggeringm completion & status + // job triggering completion & status output logic job_trigger_o, input logic job_done_i, input logic [31:0] job_status_i, @@ -62,7 +62,7 @@ module hwpe_ctrl_target // OBI interface to target SystemRDL-generated register interface output logic target_obi_req_o, input logic target_obi_gnt_i, - output logic [4:0] target_obi_addr_o, + output logic [31:0] target_obi_addr_o, output logic target_obi_we_o, output logic [3:0] target_obi_be_o, output logic [31:0] target_obi_wdata_o, From 2a204e1741eddad4d64382208f49d2efc02fe311 Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Mon, 8 Dec 2025 14:25:41 +0100 Subject: [PATCH 11/17] fix incorrect polarity of hwif_in/out signals in hwpe_ctrl_target --- rtl/hwpe_ctrl_target.sv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtl/hwpe_ctrl_target.sv b/rtl/hwpe_ctrl_target.sv index a3bc8fc..a9246fd 100644 --- a/rtl/hwpe_ctrl_target.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -74,10 +74,10 @@ module hwpe_ctrl_target input logic [ID_WIDTH-1:0] target_obi_rid_i, // wrap -> register interface signals - input hwpe_ctrl_regif_in_t hwif_in, + output hwpe_ctrl_regif_in_t hwif_in, // register interface -> wrap signals - output hwpe_ctrl_regif_out_t hwif_out + input hwpe_ctrl_regif_out_t hwif_out ); // unroll periph interconnect signals into OBI From 553fde2c1f7dffcf8fa1506321935e288d37d172 Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Mon, 8 Dec 2025 22:51:41 +0100 Subject: [PATCH 12/17] Fix a few bugs, first semi-working setup --- rtl/hwpe_ctrl_target.sv | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/rtl/hwpe_ctrl_target.sv b/rtl/hwpe_ctrl_target.sv index a9246fd..cc9c7cf 100644 --- a/rtl/hwpe_ctrl_target.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -34,6 +34,7 @@ module hwpe_ctrl_target parameter int unsigned NB_CONTEXT = 2, parameter int unsigned NB_CLEAR_CYCLES = 3, parameter int unsigned ID_WIDTH = 2, + parameter int unsigned ADDR_WIDTH = 16, parameter type hwpe_ctrl_regif_in_t = logic, // must be overridden! parameter type hwpe_ctrl_regif_out_t = logic, // must be overridden! parameter type hwpe_ctrl_job_indep_t = logic, // must be overridden! @@ -83,7 +84,7 @@ module hwpe_ctrl_target // unroll periph interconnect signals into OBI assign target_obi_req_o = target.req; assign target.gnt = target_obi_gnt_i; - assign target_obi_addr_o = target.add; + assign target_obi_addr_o = {{(32-ADDR_WIDTH){1'b0}} , target.add[ADDR_WIDTH-1:0]}; assign target_obi_we_o = ~target.wen; assign target_obi_be_o = target.be; assign target_obi_wdata_o = target.data; @@ -122,7 +123,7 @@ module hwpe_ctrl_target // generate clear enables assign soft_clear_regfile_en = soft_clear_regfile_d | (|soft_clear_regfile_q); - assign soft_clear_state_eb = soft_clear_state_d | (|soft_clear_state_q); + assign soft_clear_state_en = soft_clear_state_d | (|soft_clear_state_q); // activate clear for NB_CLEAR_CYCLES cycles in case of a SOFT_CLEAR write always_ff @(posedge clk_i or negedge rst_ni) @@ -165,6 +166,19 @@ module hwpe_ctrl_target assign hwif_in.hwpe_ctrl.acquire.acquire.next = job_offload_state_q == ACQUIRE ? HWPE_CTRL_JOB_ACQUIRED_ERR_CODE : job_fifo_full ? HWPE_CTRL_JOB_QUEUE_FULL_ERR_CODE : { 24'h0 , job_id_d }; + always_ff @(posedge clk_i or negedge rst_ni) + begin + if(~rst_ni) begin + job_id_q <= '1; + end + else if(|soft_clear_regfile_q) begin + job_id_q <= '1; + end + else if(job_done_i) begin + job_id_q <= job_id_d; + end + end + assign job_id_d = job_id_q + 1; // enable state change on ACQUIRE / COMMIT_TRIGGER register access logic job_offload_state_en; From a4abfef8706b13fad5ea8290c4f96fe9e52b21ee Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Thu, 11 Dec 2025 22:55:07 +0100 Subject: [PATCH 13/17] Update rdl.sh example with feedback from testing on NEureka --- rtl/rdl.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rtl/rdl.sh b/rtl/rdl.sh index a1782c5..3c74279 100755 --- a/rtl/rdl.sh +++ b/rtl/rdl.sh @@ -1,5 +1,6 @@ #!/bin/bash -peakrdl regblock hwpe_ctrl_regif_example.rdl -o rdl-example/ --cpuif obi-flat --default-reset arst_n --hwif-report +peakrdl regblock hwpe_ctrl_regif_example.rdl -o rdl-example/ --cpuif obi-flat --default-reset arst_n --hwif-report --addr-width 32 peakrdl html hwpe_ctrl_regif_example.rdl -o rdl-example/html/ peakrdl c-header hwpe_ctrl_regif_example.rdl -o rdl-example/hwpe_ctrl_target.h - +# PeakRDL uses unpacked structs to avoid issues at compile time, which is commendable, but incompatible with FIFOing the output of the job! +sed -i 's/typedef[[:space:]]\+struct\b/typedef struct packed/g' rdl-example/hwpe_ctrl_regif_example_pkg.sv From 641202ce5ad4d00b6ec5b4ccdd6d1777d9afbadb Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Tue, 23 Dec 2025 12:36:31 +0100 Subject: [PATCH 14/17] Add common_cells dep in Bender.yml --- Bender.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Bender.yml b/Bender.yml index 474c8cc..413d051 100644 --- a/Bender.yml +++ b/Bender.yml @@ -5,6 +5,7 @@ package: dependencies: tech_cells_generic: { git: "https://github.com/pulp-platform/tech_cells_generic.git", version: 0.2.2 } + common_cells: { git: "https://github.com/pulp-platform/common_cells.git", version: 1.39 } sources: - include_dirs: From e30c3fd7c00e0b52d4bb4d6f206c384ac74f075c Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Tue, 23 Dec 2025 14:17:42 +0100 Subject: [PATCH 15/17] Update rtl/hwpe_ctrl_regif_example.rdl Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- rtl/hwpe_ctrl_regif_example.rdl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtl/hwpe_ctrl_regif_example.rdl b/rtl/hwpe_ctrl_regif_example.rdl index 0688754..730117f 100644 --- a/rtl/hwpe_ctrl_regif_example.rdl +++ b/rtl/hwpe_ctrl_regif_example.rdl @@ -20,7 +20,7 @@ addrmap hwpe_ctrl_regif_example { name = "HWPE Control port"; - desc = ""; + desc = "Control register map for the HWPE, including mandatory control/status registers and example job-independent and job-dependent configuration registers."; // Mandatory COMMIT_TRIGGER register. Not to be updated inside HWPEs. reg hwpe_commit_trigger { From 02ca42d1ba267b7da16444ceb61ac5449eab886f Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Tue, 23 Dec 2025 14:19:22 +0100 Subject: [PATCH 16/17] Update rtl/hwpe_ctrl_target.sv Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- rtl/hwpe_ctrl_target.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtl/hwpe_ctrl_target.sv b/rtl/hwpe_ctrl_target.sv index cc9c7cf..697f34e 100644 --- a/rtl/hwpe_ctrl_target.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -19,7 +19,7 @@ * in that it exploits SystemRDL to generate a register file interface. * This module must be coupled with a register interface generated out of * a SystemRDL description. This repository contains a reference SystemRDL - * `hwpe_ctrl_regif.rdl` and a `rdl.sh` script to generate the register + * `hwpe_ctrl_regif_example.rdl` and a `rdl.sh` script to generate the register * interface with PeakRDL. HWPEs must internalize this and modify the content to * align with their required set of job-independent and job-dependent registers, * without modifying the mandatory registers. From 0255815916fe05accd091b7b95be0e31a78dcc5c Mon Sep 17 00:00:00 2001 From: Francesco Conti Date: Tue, 23 Dec 2025 14:26:05 +0100 Subject: [PATCH 17/17] Propagate job_indep registers from RDL through hwpe_ctrl_target --- rtl/hwpe_ctrl_target.sv | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rtl/hwpe_ctrl_target.sv b/rtl/hwpe_ctrl_target.sv index 697f34e..913751d 100644 --- a/rtl/hwpe_ctrl_target.sv +++ b/rtl/hwpe_ctrl_target.sv @@ -229,4 +229,7 @@ module hwpe_ctrl_target ); assign job_dep_regs_valid_o = ~job_fifo_empty; + // job-independent registers + assign job_indep_regs_o = hwif_out.hwpe_job_indep; + endmodule // hwpe_ctrl_target