diff --git a/.gitmodules b/.gitmodules index 13b71911fb8c3c24c823283f1f5ced0ef868b54d..85fb57afa1284abf83b913add0ae9423289d5dda 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "socsim"] path = socsim url = git@git.soton.ac.uk:soclabs/socsim.git +[submodule "CHIPKIT"] + path = CHIPKIT + url = git@git.soton.ac.uk:soclabs/CHIPKIT.git diff --git a/CHIPKIT b/CHIPKIT new file mode 160000 index 0000000000000000000000000000000000000000..2435cd9df8ff8a7e7d2e289b4e646eed10882e27 --- /dev/null +++ b/CHIPKIT @@ -0,0 +1 @@ +Subproject commit 2435cd9df8ff8a7e7d2e289b4e646eed10882e27 diff --git a/accelerator-wrapper b/accelerator-wrapper index 031c516e3aded99b3fe63311f1500bb751705c27..b29111dad3d10ea9499f63f39ba8536b21f51355 160000 --- a/accelerator-wrapper +++ b/accelerator-wrapper @@ -1 +1 @@ -Subproject commit 031c516e3aded99b3fe63311f1500bb751705c27 +Subproject commit b29111dad3d10ea9499f63f39ba8536b21f51355 diff --git a/flist/system.flist b/flist/system.flist new file mode 100644 index 0000000000000000000000000000000000000000..968aee3c957bdd2acf3394f73a04ee9ae760824b --- /dev/null +++ b/flist/system.flist @@ -0,0 +1,22 @@ +//----------------------------------------------------------------------------- +// Accelerator System Filelist +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Verilog Command File for Top-level Accelerator System +//----------------------------------------------------------------------------- + +// ============= Verilog library extensions =========== ++libext+.v+.vlib + +// ============= Accelerator Module search path ============= +-y $(SOC_TOP_DIR)/system/src/ ++incdir+$(SOC_TOP_DIR)/system/src/ + +$(SOC_TOP_DIR)/system/src/nanosoc_exp.v \ No newline at end of file diff --git a/flow/adp_verify.py b/flow/adp_verify.py new file mode 100644 index 0000000000000000000000000000000000000000..f2122bae70d9187cba8be3ad501657860cc2e868 --- /dev/null +++ b/flow/adp_verify.py @@ -0,0 +1,95 @@ +#----------------------------------------------------------------------------- +# ADP Command File Verification Script +# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +# +# Contributors +# +# David Mapstone (d.a.mapstone@soton.ac.uk) +# +# Copyright � 2021-3, SoC Labs (www.soclabs.org) +#----------------------------------------------------------------------------- + +class address_region(): + def __init__(self, base, size): + self.base = base + self.size = size + self.end = base + size - 4 + +class read_word(): + def __init__(self, index, region, address, read_data = 0,exp_data = 0): + self.index = index + self.region = region + self.address = int(str(address), 16) + self.read_data = int(str(read_data), 16) + self.exp_data = int(str(exp_data), 16) + + def validate(self): + if (self.address >= self.region.base and self.address <= self.region.end): + return True + else: + return False + + def check_address(self, address): + # print(f"self: {hex(self.address)} test: {address}") + if (self.address == int(str(address), 16)): + return True + else: + return False + + def set_read_data(self, read_data): + self.read_data = int(read_data, 16) + + def set_exp_data(self, exp_data): + self.exp_data = int(exp_data, 16) + + def verify(self): + assert (self.read_data == self.exp_data) + +def adp_verify(adp_input, adp_output, out_log): + # Create Input Region for Accelerator + accel_input_port = address_region(base = 0x6001_0000, size = 0x0000_0800) + accel_output_port = address_region(base = 0x6001_0800, size = 0x0000_0800) + + word_list = [] + temp_address_buf = 0x0 + + # Read in adp input + adp_input_lines = open(adp_input, "r").readlines() + idx = 0 + for line in adp_input_lines: + line_split = str(line).split() + if len(line_split) > 1: + if line_split[0].lower() == "a": + # Capture Address + temp_address_buf = line_split[1] + if line_split[0].lower() == "r": + temp_read_word = read_word(idx, accel_output_port, temp_address_buf, exp_data = line_split[1]) + if temp_read_word.validate(): + word_list.append(temp_read_word) + idx += 1 + + # Read in adp output + adp_output_lines = open(adp_output, "r").readlines() + idx = 0 + temp_address_buf = 0x0 + for line in adp_output_lines: + line_split = str(line).split() + if len(line_split) > 1: + if line_split[0] == "]A": + # Capture Address + temp_address_buf = line_split[1] + if line_split[0] == "]R": + if word_list[idx].check_address(temp_address_buf): + word_list[idx].set_read_data(line_split[1]) + idx += 1 + + # Perform Verification + for word in word_list: + word.verify() + print(f"Tests Passed on {len(word_list)} reads") + +if __name__ == "__main__": + adp_input = "ft1248_ip.log" + adp_output = "ft1248_op.log" + output_log = "verify.log" + adp_verify(adp_input,adp_output,output_log) diff --git a/nanosoc b/nanosoc index 5843789d5155903a0868741a33cf016875831b27..20e2a3d1520f66949bee7efad07e4b61aa3741a0 160000 --- a/nanosoc +++ b/nanosoc @@ -1 +1 @@ -Subproject commit 5843789d5155903a0868741a33cf016875831b27 +Subproject commit 20e2a3d1520f66949bee7efad07e4b61aa3741a0 diff --git a/set_env.sh b/set_env.sh index 8d0c2c3100aed43376ccc385b87d5b5234a798a1..6fa88ed6111e5803651a93d9966076f0300982f9 100755 --- a/set_env.sh +++ b/set_env.sh @@ -36,7 +36,7 @@ else # Source environment variables for all submodules for d in $SOC_TOP_DIR/* ; do - if [ -f "$d/.git" ]; then + if [ -e "$d/.git" ]; then if [ -f "$d/set_env.sh" ]; then # If .git file exists - submodule source $d/set_env.sh diff --git a/sha-2-accelerator b/sha-2-accelerator index 1dd9a82ce6170d363933240053894e8f84928e55..bbd478b94f719df99ade719c546cfad52dd24e40 160000 --- a/sha-2-accelerator +++ b/sha-2-accelerator @@ -1 +1 @@ -Subproject commit 1dd9a82ce6170d363933240053894e8f84928e55 +Subproject commit bbd478b94f719df99ade719c546cfad52dd24e40 diff --git a/simulate/socsim/nanosoc_sha256_hashing_stream.sh b/simulate/socsim/nanosoc_sha256_hashing_stream.sh new file mode 100755 index 0000000000000000000000000000000000000000..c3ce45fef5fd542ff13c83ddeca293bae2836f13 --- /dev/null +++ b/simulate/socsim/nanosoc_sha256_hashing_stream.sh @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# SoC Labs Cadence Xcelium simulation script for engine testbench +# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +# +# Contributors +# +# David Mapstone (d.a.mapstone@soton.ac.uk) +# +# Copyright 2022, SoC Labs (www.soclabs.org) +#----------------------------------------------------------------------------- + +#!/usr/bin/env bash + +mkdir -p $SOC_TOP_DIR/simulate/sim/ +make run_xm \ + TESTNAME=hello \ + ACCELERATOR_VC="-sv -f $ACC_ENGINE_DIR/flist/sha-2-accelerator_src.flist -f $ACC_WRAPPER_DIR/flist/wrapper_ip.flist" \ + ADP_FILE="$SOC_TOP_DIR/system/stimulus/adp_hash_stim.cmd" \ + -C $NANOSOC_DIR/Cortex-M0/nanosoc/systems/mcu/rtl_sim \ No newline at end of file diff --git a/system/src/nanosoc_exp.v b/system/src/nanosoc_exp.v new file mode 100644 index 0000000000000000000000000000000000000000..229f7565fe9dd5468a5fc8e3ffd584fe0a033095 --- /dev/null +++ b/system/src/nanosoc_exp.v @@ -0,0 +1,166 @@ +//----------------------------------------------------------------------------- +// Nanosoc Expansion Region AHB Address Region +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- +`include "cmsdk_ahb_default_slave.v" +`include "cmsdk_ahb_slave_mux.v" + +module nanosoc_exp #( + parameter ADDRWIDTH=29, // Region Address Width + parameter ACCEL_ADDRWIDTH=12 // Region Address Width + )( + input wire HCLK, // Clock + input wire HRESETn, // Reset + + // AHB connection to Initiator + input wire HSELS, + input wire [ADDRWIDTH-1:0] HADDRS, + input wire [1:0] HTRANSS, + input wire [2:0] HSIZES, + input wire HWRITES, + input wire HREADYS, + input wire [31:0] HWDATAS, + + output wire HREADYOUTS, + output wire HRESPS, + output wire [31:0] HRDATAS + ); + +//******************************************************************************** +// Internal Wires +//******************************************************************************** + +// Accelerator AHB Signals +wire HSEL0; +wire HREADYOUT0; +wire HRESP0; +wire [31:0] HRDATA0; + +// Default Slave AHB Signals +wire HSEL1; +wire HREADYOUT1; +wire HRESP1; +wire [31:0] HRDATA1; + +//******************************************************************************** +// Address decoder, need to be changed for other configuration +//******************************************************************************** +// 0x00010000 - 0x00010FFF : HSEL #0 - Hash Accelerator +// Other addresses : HSEL #1 - Default target + + assign HSEL0 = (HADDRS[ADDRWIDTH-1:12] == 'h00010) ? 1'b1:1'b0; + assign HSEL1 = HSEL0 ? 1'b0:1'b1; + +//******************************************************************************** +// Slave multiplexer module: +// multiplex the target signals to master, three ports are enabled +//******************************************************************************** + +cmsdk_ahb_slave_mux #( + 1, //PORT0_ENABLE + 1, //PORT1_ENABLE + 1, //PORT2_ENABLE + 0, //PORT3_ENABLE + 0, //PORT4_ENABLE + 0, //PORT5_ENABLE + 0, //PORT6_ENABLE + 0, //PORT7_ENABLE + 0, //PORT8_ENABLE + 0 //PORT9_ENABLE + ) u_ahb_slave_mux ( + .HCLK (HCLK), + .HRESETn (HRESETn), + .HREADY (HREADYS), + .HSEL0 (HSEL0), // Input Port 0 + .HREADYOUT0 (HREADYOUT0), + .HRESP0 (HRESP0), + .HRDATA0 (HRDATA0), + .HSEL1 (HSEL1), // Input Port 1 + .HREADYOUT1 (HREADYOUT1), + .HRESP1 (HRESP1), + .HRDATA1 (HRDATA1), + .HSEL2 (1'b0), // Input Port 2 + .HREADYOUT2 (), + .HRESP2 (), + .HRDATA2 (), + .HSEL3 (1'b0), // Input Port 3 + .HREADYOUT3 (), + .HRESP3 (), + .HRDATA3 (), + .HSEL4 (1'b0), // Input Port 4 + .HREADYOUT4 (), + .HRESP4 (), + .HRDATA4 (), + .HSEL5 (1'b0), // Input Port 5 + .HREADYOUT5 (), + .HRESP5 (), + .HRDATA5 (), + .HSEL6 (1'b0), // Input Port 6 + .HREADYOUT6 (), + .HRESP6 (), + .HRDATA6 (), + .HSEL7 (1'b0), // Input Port 7 + .HREADYOUT7 (), + .HRESP7 (), + .HRDATA7 (), + .HSEL8 (1'b0), // Input Port 8 + .HREADYOUT8 (), + .HRESP8 (), + .HRDATA8 (), + .HSEL9 (1'b0), // Input Port 9 + .HREADYOUT9 (), + .HRESP9 (), + .HRDATA9 (), + + .HREADYOUT (HREADYOUTS), // Outputs + .HRESP (HRESPS), + .HRDATA (HRDATAS) + ); + + +//******************************************************************************** +// Slave module 1: Accelerator AHB target module +//******************************************************************************** + wrapper_sha256_hashing_stream #(ACCEL_ADDRWIDTH + ) accelerator ( + .HCLK (HCLK), + .HRESETn (HRESETn), + + // Input target port: 32 bit data bus interface + .HSELS (HSEL0), + .HADDRS (HADDRS[ACCEL_ADDRWIDTH-1:0]), + .HTRANSS (HTRANSS), + .HSIZES (HSIZES), + .HWRITES (HWRITES), + .HREADYS (HREADYS), + .HWDATAS (HWDATAS), + + .HREADYOUTS (HREADYOUT0), + .HRESPS (HRESP0), + .HRDATAS (HRDATA0) + + ); + + +//******************************************************************************** +// Slave module 2: AHB default target module +//******************************************************************************** + cmsdk_ahb_default_slave u_ahb_default_slave( + .HCLK (HCLK), + .HRESETn (HRESETn), + .HSEL (HSEL1), + .HTRANS (HTRANSS), + .HREADY (HREADYS), + .HREADYOUT (HREADYOUT1), + .HRESP (HRESPS) + ); + + assign HRDATA1 = {32{1'b0}}; // Default target don't have data + +endmodule diff --git a/wrapper/regs/cregs.csv b/wrapper/regs/cregs.csv new file mode 100644 index 0000000000000000000000000000000000000000..c68d8e50d14cf0175dfaf88bbf9b0a18bee5b30f --- /dev/null +++ b/wrapper/regs/cregs.csv @@ -0,0 +1,5 @@ +name idx nbits start access test rval desc + +# Wrapper Control Register +accelerator_en 0 32 0 rw 0 0x00000000 Accelerator Enable Register +accelerator_channel_en 1 32 0 rw 0 0x00000000 Accelerator Channel Enable Register \ No newline at end of file diff --git a/wrapper/regs/cregs/CREGS.h b/wrapper/regs/cregs/CREGS.h new file mode 100644 index 0000000000000000000000000000000000000000..03b467eacbb96e4976e6acf1f83b6ca41610f727 --- /dev/null +++ b/wrapper/regs/cregs/CREGS.h @@ -0,0 +1,16 @@ +// VGEN START: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + +#ifndef CREGS_H +#define CREGS_H + + +typedef struct +{ + __IO uint32_t ACCELERATOR_EN; /* Offset: 0x0 (R/W) Accelerator Enable Register */ + __IO uint32_t ACCELERATOR_CHANNEL_EN; /* Offset: 0x4 (R/W) Accelerator Channel Enable Register */ +} CREGS_TypeDef; + +#endif + +// VGEN END: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + diff --git a/wrapper/regs/cregs/cregs.inst.sv b/wrapper/regs/cregs/cregs.inst.sv new file mode 100644 index 0000000000000000000000000000000000000000..1ad2ed0a83a321531c11248a382bfbff11e8a078 --- /dev/null +++ b/wrapper/regs/cregs/cregs.inst.sv @@ -0,0 +1,24 @@ +// VGEN START: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + +// START +logic [31:0] accelerator_en; +logic [31:0] accelerator_channel_en; + +cregs u_cregs ( + +// clocks and resets +.clk(pclk), +.rstn(presetn), + +// Synchronous register interface +.regbus (cregs.sink), + +// reg file signals +.accelerator_en(accelerator_en[31:0]) /* idx 0 */, +.accelerator_channel_en(accelerator_channel_en[31:0]) /* idx 1 */ + +); +// END + +// VGEN END: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + diff --git a/wrapper/regs/cregs/cregs.md b/wrapper/regs/cregs/cregs.md new file mode 100644 index 0000000000000000000000000000000000000000..9e3b82cb35ffeb7efa4fc4aff652b15099b6c5a8 --- /dev/null +++ b/wrapper/regs/cregs/cregs.md @@ -0,0 +1,15 @@ +// VGEN START: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + +# Programmers Model + +## Module: CREGS + +| Address Offset | Signal Name | Access | Bit width | Start bit | Description | +| --- | --- | --- | --- | --- | --- | +| +| 0x0 | **ACCELERATOR_EN** | RW | 32 | 0 | Accelerator Enable Register | +| 0x4 | **ACCELERATOR_CHANNEL_EN** | RW | 32 | 0 | Accelerator Channel Enable Register | + + +// VGEN END: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + diff --git a/wrapper/regs/cregs/cregs.py b/wrapper/regs/cregs/cregs.py new file mode 100644 index 0000000000000000000000000000000000000000..de7171d029c45a3c54f1d3bc642e94ae5c8eb5bd --- /dev/null +++ b/wrapper/regs/cregs/cregs.py @@ -0,0 +1,15 @@ +# // VGEN START: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + +class Cregs(object): + + def __init__(self,base_offset): + self.base_offset = base_offset + + + self.ACCELERATOR_EN = self.base_offset + 0x0 # Accelerator Enable Register + self.ACCELERATOR_CHANNEL_EN = self.base_offset + 0x4 # Accelerator Channel Enable Register + self.ACCELERATOR_CHANNEL_EN = self.base_offset + 0x4 # Accelerator Channel Enable Register + + +# // VGEN END: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + diff --git a/wrapper/regs/cregs/cregs.sv b/wrapper/regs/cregs/cregs.sv new file mode 100644 index 0000000000000000000000000000000000000000..8c1d454e0d75f8fd4a6516ca743defa770529d2c --- /dev/null +++ b/wrapper/regs/cregs/cregs.sv @@ -0,0 +1,138 @@ +// VGEN START: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + +//----------------------------------------------------------------------------- +// SoC Labs APB register Template +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright 2023, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- +// VGEN: HEADER +// Register file contents: +//{'name': 'accelerator_en', 'idx': '0', 'nbits': '32', 'start': '0', 'access': 'rw', 'test': '0', 'rval': '0x00000000', 'desc': 'Accelerator Enable Register'} +//{'name': 'accelerator_channel_en', 'idx': '1', 'nbits': '32', 'start': '0', 'access': 'rw', 'test': '0', 'rval': '0x00000000', 'desc': 'Accelerator Channel Enable Register'} + + +// VGEN: MODULE NAME +module cregs ( + +// clocks and resets + input logic clk, + input logic rstn, + +// APB inteface + input logic psel, + input logic [ADDRWIDTH:0] paddr, + input logic penable, + input logic pwrite, + input logic [31:0] pwdata, + + output logic [31:0] prdata, + output logic pready, + output logic pslverr, + +// VGEN: INPUTS TO REGS + + +// VGEN: OUTPUTS FROM REGS + output logic [31:0] accelerator_en /* idx #0: Accelerator Enable Register */, + output logic [31:0] accelerator_channel_en /* idx #1: Accelerator Channel Enable Register */ + +); + +//------------------------------------------------------------------------------ +// APB Interface +//------------------------------------------------------------------------------ + +logic [ADDRWIDTH-1:0] addr; +logic read_en; +logic write_en; +logic [31:0] wdata; +logic [31:0] rdata; + +// APB interface +assign pready = 1'b1; //always ready. Can be customized to support waitstate if required. +assign pslverr = 1'b0; //alwyas OKAY. Can be customized to support error response if required. + + +// register read and write signal +assign addr = paddr; +assign read_en = psel & (~pwrite); // assert for whole apb read transfer +assign write_en = psel & (~penable) & pwrite; // assert for 1st cycle of write transfer + // It is also possible to change the design to perform the write in the 2nd + // APB cycle. E.g. + // assign write_en = psel & penable & pwrite; + // However, if the design generate waitstate, this expression will result + // in write_en being asserted for multiple cycles. +assign wdata = pwdata; +assign prdata = rdata; + +//------------------------------------------------------------------------------ +// Regsiter write +//------------------------------------------------------------------------------ + +// VGEN: REG WRITE +// idx #0 +logic [31:0] accelerator_en_reg; +always@(posedge clk or negedge rstn) begin + if(~rstn) begin + accelerator_en_reg[31:0] <= '0; + end else begin + if(write_en & (addr[9:2]==8'h0)) accelerator_en_reg[31:0] <= wdata[31:0]; + end +end +assign accelerator_en[31:0] = accelerator_en_reg[31:0]; + +// idx #1 +logic [31:0] accelerator_channel_en_reg; +always@(posedge clk or negedge rstn) begin + if(~rstn) begin + accelerator_channel_en_reg[31:0] <= '0; + end else begin + if(write_en & (addr[9:2]==8'h1)) accelerator_channel_en_reg[31:0] <= wdata[31:0]; + end +end +assign accelerator_channel_en[31:0] = accelerator_channel_en_reg[31:0]; + + + +//------------------------------------------------------------------------------ +// Regsiter read +//------------------------------------------------------------------------------ + + +logic [31:0] rdata_o; + +always @* +begin + if (read_en) + begin + rdata_o[31:0] = 32'h00000000; + + // VGEN: REG READ + if(addr[9:2]==8'h0) if(addr[9:2]==8'h0) rdata_o[31:0] = accelerator_en[31:0]; // idx #0 + if(addr[9:2]==8'h1) if(addr[9:2]==8'h1) rdata_o[31:0] = accelerator_channel_en[31:0]; // idx #1 + + end + else + begin + rdata_o[31:0] = {32'h00000000}; + end +end + +assign rdata[31:0] = rdata_o[31:0]; + + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ + + + + +endmodule +// VGEN END: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + diff --git a/wrapper/regs/cregs/cregs.sv.bak b/wrapper/regs/cregs/cregs.sv.bak new file mode 100644 index 0000000000000000000000000000000000000000..d0ca98a27542bd6c55bb388c49d4e712213edec3 --- /dev/null +++ b/wrapper/regs/cregs/cregs.sv.bak @@ -0,0 +1,139 @@ +// VGEN START: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:58:58 24/03/2023 + +//----------------------------------------------------------------------------- +// SoC Labs APB register Template +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright 2023, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- +// VGEN: HEADER +// Register file contents: +//{'name': 'accelerator_en', 'idx': '0', 'nbits': '32', 'start': '0', 'access': 'rw', 'test': '0', 'rval': '0x00000000', 'desc': 'Accelerator Enable Register'} +//{'name': 'accelerator_channel_en', 'idx': '1', 'nbits': '32', 'start': '0', 'access': 'rw', 'test': '0', 'rval': '0x00000000', 'desc': 'Accelerator Channel Enable Register'} + + + +// VGEN: MODULE NAME +module cregs ( + +// clocks and resets + input logic clk, + input logic rstn, + +// APB inteface + input logic psel, + input logic [ADDRWIDTH:0] paddr, + input logic penable, + input logic pwrite, + input logic [31:0] pwdata, + + output logic [31:0] prdata, + output logic pready, + output logic pslverr, + +// VGEN: INPUTS TO REGS + + +// VGEN: OUTPUTS FROM REGS + output logic [31:0] accelerator_en /* idx #0: Accelerator Enable Register */, + output logic [31:0] accelerator_channel_en /* idx #1: Accelerator Channel Enable Register */ + +); + +//------------------------------------------------------------------------------ +// APB Interface +//------------------------------------------------------------------------------ + +logic [ADDRWIDTH-1:0] addr; +logic read_en; +logic write_en; +logic [31:0] wdata; +logic [31:0] rdata; + +// APB interface +assign pready = 1'b1; //always ready. Can be customized to support waitstate if required. +assign pslverr = 1'b0; //alwyas OKAY. Can be customized to support error response if required. + + +// register read and write signal +assign addr = paddr; +assign read_en = psel & (~pwrite); // assert for whole apb read transfer +assign write_en = psel & (~penable) & pwrite; // assert for 1st cycle of write transfer + // It is also possible to change the design to perform the write in the 2nd + // APB cycle. E.g. + // assign write_en = psel & penable & pwrite; + // However, if the design generate waitstate, this expression will result + // in write_en being asserted for multiple cycles. +assign wdata = pwdata; +assign prdata = rdata; + +//------------------------------------------------------------------------------ +// Regsiter write +//------------------------------------------------------------------------------ + +// VGEN: REG WRITE +// idx #0 +logic [31:0] accelerator_en_reg; +always@(posedge clk or negedge rstn) begin + if(~rstn) begin + accelerator_en_reg[31:0] <= '0; + end else begin + if(write_en & (addr[9:2]==8'h0)) accelerator_en_reg[31:0] <= wdata[31:0]; + end +end +assign accelerator_en[31:0] = accelerator_en_reg[31:0]; + +// idx #1 +logic [31:0] accelerator_channel_en_reg; +always@(posedge clk or negedge rstn) begin + if(~rstn) begin + accelerator_channel_en_reg[31:0] <= '0; + end else begin + if(write_en & (addr[9:2]==8'h1)) accelerator_channel_en_reg[31:0] <= wdata[31:0]; + end +end +assign accelerator_channel_en[31:0] = accelerator_channel_en_reg[31:0]; + + + +//------------------------------------------------------------------------------ +// Regsiter read +//------------------------------------------------------------------------------ + + +logic [31:0] rdata_o; + +always @* +begin + if (read_en) + begin + rdata_o[31:0] = 32'h00000000; + + // VGEN: REG READ + if(addr[9:2]==8'h0) if(addr[9:2]==8'h0) rdata_o[31:0] = accelerator_en[31:0]; // idx #0 + if(addr[9:2]==8'h1) if(addr[9:2]==8'h1) rdata_o[31:0] = accelerator_channel_en[31:0]; // idx #1 + + end + else + begin + rdata_o[31:0] = {32'h00000000}; + end +end + +assign rdata[31:0] = rdata_o[31:0]; + + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ + + + + +endmodule +// VGEN END: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:58:58 24/03/2023 + diff --git a/wrapper/regs/cregs/cregs_test.c b/wrapper/regs/cregs/cregs_test.c new file mode 100644 index 0000000000000000000000000000000000000000..1e1345d7773956524a5ba397ef41b8a52ff3f2ec --- /dev/null +++ b/wrapper/regs/cregs/cregs_test.c @@ -0,0 +1,36 @@ +// VGEN END: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + +#include "cregs_test.h" + +// This test is intended to check initial (reset) values of registers +int cregs_initial_value_test(void) { + int num_errors=0; + + if (SM2_CREGS->ACCELERATOR_EN != 0) {num_errors += 1; puts("ERROR: ACCELERATOR_EN");} + if (SM2_CREGS->ACCELERATOR_CHANNEL_EN != 0) {num_errors += 1; puts("ERROR: ACCELERATOR_CHANNEL_EN");} + + + return num_errors; + +} + +// This test is intended to check write read to registers +int cregs_write_read_test(void) { + int num_errors=0; + + SM2_CREGS->ACCELERATOR_EN = 0xFFFFFFFF; // write all-1s + if (SM2_CREGS->ACCELERATOR_EN != (0xFFFFFFFF >> (32-32))) {num_errors += 1; puts("ERROR: ACCELERATOR_EN");} // check field is all-1s + SM2_CREGS->ACCELERATOR_EN = 0x0; // clear field + if (SM2_CREGS->ACCELERATOR_EN != 0x0) {num_errors += 1; puts("ERROR: ACCELERATOR_EN");} // check field is all-0s + SM2_CREGS->ACCELERATOR_CHANNEL_EN = 0xFFFFFFFF; // write all-1s + if (SM2_CREGS->ACCELERATOR_CHANNEL_EN != (0xFFFFFFFF >> (32-32))) {num_errors += 1; puts("ERROR: ACCELERATOR_CHANNEL_EN");} // check field is all-1s + SM2_CREGS->ACCELERATOR_CHANNEL_EN = 0x0; // clear field + if (SM2_CREGS->ACCELERATOR_CHANNEL_EN != 0x0) {num_errors += 1; puts("ERROR: ACCELERATOR_CHANNEL_EN");} // check field is all-0s + + + return num_errors; + +} + +// VGEN END: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + diff --git a/wrapper/regs/cregs/cregs_test.h b/wrapper/regs/cregs/cregs_test.h new file mode 100644 index 0000000000000000000000000000000000000000..eaafa6d2e5aff0be80ce411ad90268044ae87081 --- /dev/null +++ b/wrapper/regs/cregs/cregs_test.h @@ -0,0 +1,18 @@ +// VGEN START: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + +#ifndef CREGS_TEST_H +#define CREGS_TEST_H + + +#include "SM2_CM0.h" + +// This test is intended to check initial (reset) values of registers +int cregs_initial_value_test(void); + +// This test is intended to check write and read to registers +int cregs_write_read_test(void); + +#endif + +// VGEN END: Autogenerated by /Users/davidmapstone/Documents/SoCLabs/RTL/accelerator-system-top/CHIPKIT/tools/vgen/bin/vgen.py on 10:59:11 24/03/2023 + diff --git a/wrapper/src/wrapper_sha256_hashing_stream.sv b/wrapper/src/wrapper_sha256_hashing_stream.sv index 89dd2976a273518111327fbcf63d121def088af0..781e02827c1433af79b4d59f0f968637e25b645d 100644 --- a/wrapper/src/wrapper_sha256_hashing_stream.sv +++ b/wrapper/src/wrapper_sha256_hashing_stream.sv @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// SoC Labs Basic Accelerator Wrapper for Hashing Stream +// SoC Labs Basic Example Accelerator Wrapper // A joint work commissioned on behalf of SoC Labs; under Arm Academic Access license. // // Contributors @@ -8,180 +8,307 @@ // // Copyright 2023; SoC Labs (www.soclabs.org) //----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// The confidential and proprietary information contained in this file may -// only be used by a person authorised under and to the extent permitted -// by a subsisting licensing agreement from Arm Limited or its affiliates. -// -// (C) COPYRIGHT 2010-2011 Arm Limited or its affiliates. -// ALL RIGHTS RESERVED -// -// This entire notice must be reproduced on all copies of this file -// and copies of this file may only be made by a person if such person is -// permitted to do so under the terms of a subsisting license agreement -// from Arm Limited or its affiliates. -// -// SVN Information -// -// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $ -// -// Revision : $Revision: 371321 $ -// -// Release Information : Cortex-M System Design Kit-r1p1-00rel0 -// -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// Abstract : AHB-lite example slave, support 4 32-bit register read and write, -// each register can be accessed by byte, half word or word. -// The example slave always output ready and OKAY response to the master -//----------------------------------------------------------------------------- module wrapper_sha256_hashing_stream #( - parameter ADDRWIDTH=12 + parameter AHBADDRWIDTH=12, + parameter INPACKETWIDTH=512, + parameter CFGSIZEWIDTH=64, + parameter CFGSCHEMEWIDTH=2, + parameter OUTPACKETWIDTH=256 ) ( input logic HCLK, // Clock input logic HRESETn, // Reset - // AHB connection to Initiator - input logic HSELS, - input logic [ADDRWIDTH-1:0] HADDRS, - input logic [1:0] HTRANSS, - input logic [2:0] HSIZES, - input logic HWRITES, - input logic HREADYS, - input logic [31:0] HWDATAS, - - output logic HREADYOUTS, - output logic HRESPS, - output logic [31:0] HRDATAS + // AHB connection to Initiator + input logic HSELS, + input logic [AHBADDRWIDTH-1:0] HADDRS, + input logic [1:0] HTRANSS, + input logic [2:0] HSIZES, + input logic HWRITES, + input logic HREADYS, + input logic [31:0] HWDATAS, + + output logic HREADYOUTS, + output logic HRESPS, + output logic [31:0] HRDATAS, + + //TODO: Add APB Interface + + // Input Data Request Signal to DMAC + output logic in_data_req, + + // Output Data Request Signal to DMAC + output logic out_data_req ); - // ---------------------------------------- - // Internal wires declarations - - // Register module interface signals - logic [ADDRWIDTH-1:0] in_buf_addr; - logic in_buf_read_en; - logic in_buf_write_en; - logic [3:0] in_buf_byte_strobe; - logic [31:0] in_buf_wdata; - logic [31:0] in_buf_rdata; - - // Input Port Wire Declarations - logic [ADDRWIDTH-2:0] input_addr; - logic input_read_en; - logic input_write_en; - logic [3:0] input_byte_strobe; - logic [31:0] input_wdata; - logic [31:0] input_rdata; - logic input_wready; - logic input_rready; - - // Output Port Wire Declarations - logic [ADDRWIDTH-2:0] output_addr; - logic output_read_en; - logic output_write_en; - logic [3:0] output_byte_strobe; - logic [31:0] output_wdata; - logic [31:0] output_rdata; - logic output_wready; - logic output_rready; - - // Internal Wiring - // Input Packet Wires - logic [511:0] in_packet; - logic in_packet_last; - logic in_packet_valid; - logic in_packet_ready; - - // Output Packet Wires - logic [255:0] out_packet; - logic out_packet_last; - logic out_packet_valid; - logic out_packet_ready; - - // Configuration Tie Off - logic [63:0] cfg_size; - logic [1:0] cfg_scheme; - logic cfg_last; - logic cfg_valid; - logic cfg_ready; - assign cfg_size = 64'd512; - assign cfg_scheme = 2'd0; - assign cfg_last = 1'b1; - assign cfg_valid = 1'b1; + //********************************************************** + // Internal AHB Parameters + //********************************************************** + + // Input Port Parameters + localparam [AHBADDRWIDTH-1:0] INPORTADDR = 'h000; + localparam INPORTAHBADDRWIDTH = AHBADDRWIDTH - 1; + + // Output Port Parameters + localparam [AHBADDRWIDTH-1:0] OUTPORTADDR = 'h800; + localparam OUTPORTAHBADDRWIDTH = AHBADDRWIDTH - 1; + + localparam OUTPACKETBYTEWIDTH = $clog2(OUTPACKETWIDTH/8); // Number of Bytes in Packet + localparam OUTPACKETSPACEWIDTH = OUTPORTAHBADDRWIDTH-OUTPACKETBYTEWIDTH; // Number of Bits to represent all Packets in Address Space + + //********************************************************** + // Wrapper AHB Components + //********************************************************** - //----------------------------------------------------------- - // Module logic start //---------------------------------------------------------- + // Internal AHB Decode Logic + //---------------------------------------------------------- + + // AHB Target 0 - Engine Input Port + logic hsel0; + logic hreadyout0; + logic hresp0; + logic [31:0] hrdata0; + + // AHB Target 1 - Engine Output Port + logic hsel1; + logic hreadyout1; + logic hresp1; + logic [31:0] hrdata1; + + // AHB Target 2 - Default Target + logic hsel2; + logic hreadyout2; + logic hresp2; + logic [31:0] hrdata2; + + // Internal AHB Address Assignment + assign hsel0 = ((HADDRS < OUTPORTADDR) && (HADDRS >= INPORTADDR)) ? 1'b1:1'b0; // Input Port Select + assign hsel1 = (HADDRS >= OUTPORTADDR) ? 1'b1:1'b0; // Output Port Select + assign hsel2 = (hsel0 | hsel1) ? 1'b0:1'b1; // Default Target Select + + // AHB Target Multiplexer + cmsdk_ahb_slave_mux #( + 1, //PORT0_ENABLE + 1, //PORT1_ENABLE + 1, //PORT2_ENABLE + 0, //PORT3_ENABLE + 0, //PORT4_ENABLE + 0, //PORT5_ENABLE + 0, //PORT6_ENABLE + 0, //PORT7_ENABLE + 0, //PORT8_ENABLE + 0 //PORT9_ENABLE + ) u_ahb_slave_mux ( + .HCLK (HCLK), + .HRESETn (HRESETn), + .HREADY (HREADYS), + .HSEL0 (hsel0), // Input Port 0 + .HREADYOUT0 (hreadyout0), + .HRESP0 (hresp0), + .HRDATA0 (hrdata0), + .HSEL1 (hsel1), // Input Port 1 + .HREADYOUT1 (hreadyout1), + .HRESP1 (hresp1), + .HRDATA1 (hrdata1), + .HSEL2 (hsel2), // Input Port 2 + .HREADYOUT2 (hreadyout2), + .HRESP2 (hresp2), + .HRDATA2 (hrdata2), + .HSEL3 (1'b0), // Input Port 3 + .HREADYOUT3 (), + .HRESP3 (), + .HRDATA3 (), + .HSEL4 (1'b0), // Input Port 4 + .HREADYOUT4 (), + .HRESP4 (), + .HRDATA4 (), + .HSEL5 (1'b0), // Input Port 5 + .HREADYOUT5 (), + .HRESP5 (), + .HRDATA5 (), + .HSEL6 (1'b0), // Input Port 6 + .HREADYOUT6 (), + .HRESP6 (), + .HRDATA6 (), + .HSEL7 (1'b0), // Input Port 7 + .HREADYOUT7 (), + .HRESP7 (), + .HRDATA7 (), + .HSEL8 (1'b0), // Input Port 8 + .HREADYOUT8 (), + .HRESP8 (), + .HRDATA8 (), + .HSEL9 (1'b0), // Input Port 9 + .HREADYOUT9 (), + .HRESP9 (), + .HRDATA9 (), + + .HREADYOUT (HREADYOUTS), // Outputs + .HRESP (HRESPS), + .HRDATA (HRDATAS) + ); + + //---------------------------------------------------------- + // Input Port Logic + //---------------------------------------------------------- + + // Engine Input Port Wire declarations + logic [INPACKETWIDTH-1:0] in_packet; + logic in_packet_last; + logic in_packet_valid; + logic in_packet_ready; - // Interface block to convert AHB transfers to Register transfers to engine input/output channels - // engine Input/Output Channels - wrapper_ahb_vr_interface #( - ADDRWIDTH - ) u_wrapper_ahb_interface ( + // Packet Constructor Instantiation + wrapper_ahb_packet_constructor #( + INPORTAHBADDRWIDTH, + INPACKETWIDTH + ) u_wrapper_data_input_port ( .hclk (HCLK), .hresetn (HRESETn), // Input slave port: 32 bit data bus interface - .hsels (HSELS), - .haddrs (HADDRS), + .hsels (hsel0), + .haddrs (HADDRS[AHBADDRWIDTH-2:0]), .htranss (HTRANSS), .hsizes (HSIZES), .hwrites (HWRITES), .hreadys (HREADYS), .hwdatas (HWDATAS), - .hreadyouts (HREADYOUTS), - .hresps (HRESPS), - .hrdatas (HRDATAS), - - // Register interface - Accelerator Engine Input - .input_addr (input_addr), - .input_read_en (input_read_en), - .input_write_en (input_write_en), - .input_byte_strobe (input_byte_strobe), - .input_wdata (input_wdata), - .input_rdata (input_rdata), - .input_wready (input_wready), - .input_rready (input_rready), - - // Register interface - Accelerator Engine Output - .output_addr (output_addr), - .output_read_en (output_read_en), - .output_write_en (output_write_en), - .output_byte_strobe (output_byte_strobe), - .output_wdata (output_wdata), - .output_rdata (output_rdata), - .output_wready (output_wready), - .output_rready (output_rready) + .hreadyouts (hreadyout0), + .hresps (hresp0), + .hrdatas (hrdata0), + + // Valid/Ready Interface + .packet_data (in_packet), + .packet_data_last (in_packet_last), + .packet_data_valid (in_packet_valid), + .packet_data_ready (in_packet_ready), + + // Input Data Request + .data_req (in_data_req) ); - wrapper_packet_construct #( - (ADDRWIDTH - 1), // Only half address map allocated to this device - 512 // Packet Width - ) u_wrapper_packet_construct ( + //---------------------------------------------------------- + // Configuration Port Logic + //---------------------------------------------------------- + + // Engine Configuration Port Wire declarations + logic [CFGSIZEWIDTH-1:0] cfg_size; + logic [CFGSCHEMEWIDTH-1:0] cfg_scheme; + logic cfg_last; + logic cfg_valid; + logic cfg_ready; + + // Engine Configuration Port Tied-off to fixed values + assign cfg_size = 64'd512; + assign cfg_scheme = 2'd0; + assign cfg_last = 1'b1; + assign cfg_valid = 1'b1; + + //---------------------------------------------------------- + // Output Port Logic + //---------------------------------------------------------- + + // Engine Output Port Wire declarations + logic [OUTPACKETWIDTH-1:0] out_packet; + logic out_packet_last; + logic [OUTPACKETSPACEWIDTH-1:0] out_packet_remain; + logic out_packet_valid; + logic out_packet_ready; + + // Relative Read Address for Start of Current Block + logic [OUTPORTAHBADDRWIDTH-1:0] block_read_addr; + + // Block Packets Remaining Tie-off (only ever one packet per block) + assign out_packet_remain = {OUTPACKETSPACEWIDTH{1'b0}}; + + // Packet Deconstructor Instantiation + wrapper_ahb_packet_deconstructor #( + OUTPORTAHBADDRWIDTH, + OUTPACKETWIDTH + ) u_wrapper_data_output_port ( .hclk (HCLK), .hresetn (HRESETn), - // Register interface - .addr (input_addr), - .read_en (input_read_en), - .write_en (input_write_en), - .byte_strobe (input_byte_strobe), - .wdata (input_wdata), - .rdata (input_rdata), - .wready (input_wready), - .rready (input_rready), + // Input slave port: 32 bit data bus interface + .hsels (hsel1), + .haddrs (HADDRS[AHBADDRWIDTH-2:0]), + .htranss (HTRANSS), + .hsizes (HSIZES), + .hwrites (HWRITES), + .hreadys (HREADYS), + .hwdatas (HWDATAS), + + .hreadyouts (hreadyout1), + .hresps (hresp1), + .hrdatas (hrdata1), // Valid/Ready Interface - .packet_data (in_packet), - .packet_data_last (in_packet_last), - .packet_data_valid (in_packet_valid), - .packet_data_ready (in_packet_ready) + .packet_data (out_packet), + .packet_data_last (out_packet_last), + .packet_data_remain (out_packet_remain), + .packet_data_valid (out_packet_valid), + .packet_data_ready (out_packet_ready), + + // Input Data Request + .data_req (out_data_req), + + // Read Address Interface + .block_read_addr (block_read_addr) + ); + + //---------------------------------------------------------- + // Default AHB Target Logic + //---------------------------------------------------------- + + // AHB Default Target Instantiation + cmsdk_ahb_default_slave u_ahb_default_slave( + .HCLK (HCLK), + .HRESETn (HRESETn), + .HSEL (hsel2), + .HTRANS (HTRANSS), + .HREADY (HREADYS), + .HREADYOUT (hreadyout2), + .HRESP (hresp2) ); + // Default Targets Data is tied off + assign hrdata2 = {32{1'b0}}; + + //********************************************************** + // Wrapper APB Components + //********************************************************** + + // TODO: Instantiate APB Mux + + // TODO: Instantiate APB Default Target + + // TODO: Wrapper Register Blocks + + //********************************************************** + // Wrapper Interrupt Generation + //********************************************************** + + // TODO: Instantiate IRQ Generator + + //********************************************************** + // Wrapper DMA Data Request Generation + //********************************************************** + + // TODO: Write up data request logic through registers + + //********************************************************** + // Accelerator Engine + //********************************************************** + + //---------------------------------------------------------- + // Accelerator Engine Logic + //---------------------------------------------------------- + + // Hashing Accelerator Instatiation sha256_hashing_stream u_sha256_hashing_stream ( .clk (HCLK), .nrst (HRESETn), @@ -208,28 +335,5 @@ module wrapper_sha256_hashing_stream #( .data_out_ready (out_packet_ready) ); - wrapper_packet_deconstruct #( - (ADDRWIDTH - 1), // Only half address map allocated to this device - 256 // Ouptut Packet WIdth - ) u_wrapper_packet_deconstruct ( - .hclk (HCLK), - .hresetn (HRESETn), - - // Register interface - .addr (output_addr), - .read_en (output_read_en), - .write_en (output_write_en), - .byte_strobe (output_byte_strobe), - .wdata (output_wdata), - .rdata (output_rdata), - .wready (output_wready), - .rready (output_rready), - - // Valid/Ready Interface - .packet_data (out_packet), - .packet_data_last (out_packet_last), - .packet_data_valid (out_packet_valid), - .packet_data_ready (out_packet_ready) - ); endmodule \ No newline at end of file diff --git a/wrapper/verif/tb_wrapper_sha256_hashing_stream.sv b/wrapper/verif/tb_wrapper_sha256_hashing_stream.sv index 36def961336aa07a44f82d4d3e466b997be39689..67579c7a6bb43ad57487c79dad7e6ae4995a8654 100644 --- a/wrapper/verif/tb_wrapper_sha256_hashing_stream.sv +++ b/wrapper/verif/tb_wrapper_sha256_hashing_stream.sv @@ -147,13 +147,13 @@ cmsdk_ahb_fileread_master32 #(InputFileName, //******************************************************************************** // Slave multiplexer module: -// multiplex the slave signals to master, three ports are enabled +// multiplex the slave signals to master, two ports are enabled //******************************************************************************** cmsdk_ahb_slave_mux #( 1, //PORT0_ENABLE 1, //PORT1_ENABLE - 1, //PORT2_ENABLE + 0, //PORT2_ENABLE 0, //PORT3_ENABLE 0, //PORT4_ENABLE 0, //PORT5_ENABLE @@ -231,8 +231,10 @@ cmsdk_ahb_fileread_master32 #(InputFileName, .HREADYOUTS (hreadyout0), .HRESPS (hresp0), - .HRDATAS (hrdata0) + .HRDATAS (hrdata0), + // Input Data Request to DMAC + .in_data_req () );