diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..1ec1bffa34413c426c8dbf6efd2ba0748ffb2a31 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.vcd +*.vvp \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..43e33e6ae2f2ebdefbefb5c5363f6bb2235a1b67 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "workbench.colorCustomizations": { + "activityBar.background": "#00360F", + "titleBar.activeBackground": "#004C16", + "titleBar.activeForeground": "#EDFFF2" + } +} \ No newline at end of file diff --git a/README.md b/README.md index 047477fada6dee5cfef7f84ec759732b35445f2f..9962e2223c92964ac93dc6978f6ce346375a8683 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,34 @@ -# Sample GitLab Project +# SHA-2 Accelerator -This sample project shows how a project in GitLab looks for demonstration purposes. It contains issues, merge requests and Markdown files in many branches, -named and filled with lorem ipsum. +This project is an example accelerator which can be combined with the SoC Labs SoC infrastructure. -You can look around to get an idea how to structure your project and, when done, you can safely delete this project. +## Repository Structure +The respository is currently broken down into 2 main directories: +- hdl +- simulate -[Learn more about creating GitLab projects.](https://docs.gitlab.com/ee/gitlab-basics/create-project.html) +HDL contains all the verilog files. This is seperated into: +- src +- verif + +src contains SystemVerilog design files and verif contains the SystemVerilog testbenches and verification resources. + +The simulate directory contains the socsim script, along with a directory called "simulators" which contains simulator-specific scripts and a "sim" directory which contains dumps and logs from simulation runs. The files in this directory should not be commited to the Git. +## Setting Up Environment +To be able to simulate in this repository, you will first need to source the sourceme: +``` +% source sourceme +``` +This will set up the environment variables and will set the simulator used. Defaultly, this is set to ivlog - Icarus Verilog. This can be overloaded from the command line with the following command: +``` +% SIMULATOR=yoursimulator +``` + +Once this is done, a simulation can be ran using the socsim command: +``` +% socsim +``` +This will generate simulation dumps in the following directory: +``` +% $SHA_2_ACC_DIR/simulate/sim +``` \ No newline at end of file diff --git a/hdl/src/sha_2_engine.sv b/hdl/src/sha_2_engine.sv new file mode 100644 index 0000000000000000000000000000000000000000..5820d35bab3fa32a2b420187dbc1e335240c9ab3 --- /dev/null +++ b/hdl/src/sha_2_engine.sv @@ -0,0 +1,214 @@ +//----------------------------------------------------------------------------- +// SoC Labs Basic SHA-2 Engine Top-level +// 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) +//----------------------------------------------------------------------------- + +module sha_2_engine ( + // Clocking Signals + input logic clk, + input logic nrst, + + // Data In data and Handshaking + input logic [511:0] data_in, + input logic data_in_valid, + output logic data_in_ready, + + // Config data and Handshaking + input logic [63:0] cfg_size, + input logic [1:0] cfg_scheme, + input logic cfg_valid, + output logic cfg_ready, + + // Data Out data and Handshaking + output logic [511:0] data_out, + output logic data_out_valid, + input logic data_out_ready +); + + // Stage 1: Input Data Registering + + // Data In FIFO Signals + logic [511:0] data_in_fifo [3:0]; + logic [2:0] data_in_fifo_write_ptr; + logic [2:0] data_in_fifo_read_ptr; + logic [2:0] data_in_fifo_ptr_dif; + wire [1:0] data_in_fifo_write_ptr_val, data_in_fifo_read_ptr_val; + + // Data In FIFO Pointer Derived Signal Assignments + assign data_in_fifo_ptr_dif = data_in_fifo_write_ptr - data_in_fifo_read_ptr; + assign data_in_fifo_write_ptr_val = data_in_fifo_write_ptr [1:0]; + assign data_in_fifo_read_ptr_val = data_in_fifo_read_ptr [1:0]; + + // Config FIFO Signals + logic [63:0] cfg_size_fifo [3:0]; + logic [1:0] cfg_scheme_fifo [3:0]; + logic [2:0] cfg_fifo_write_ptr; + logic [2:0] cfg_fifo_read_ptr; + logic [2:0] cfg_fifo_ptr_dif; + logic [1:0] cfg_fifo_write_ptr_val, cfg_fifo_read_ptr_val; + + // Config FIFO Pointer Derived Signal Assignments + assign cfg_fifo_ptr_dif = cfg_fifo_write_ptr - cfg_fifo_read_ptr; + assign cfg_fifo_write_ptr_val = cfg_fifo_write_ptr [1:0]; + assign cfg_fifo_read_ptr_val = cfg_fifo_read_ptr [1:0]; + + // Conditions to write and read from FIFO's + // Write Ptr | Read Ptr | Result | Valid Write | Valid Read + // 000 - 000 = 000 | Y | N + // 001 - 000 = 001 | Y | Y + // 010 - 000 = 010 | Y | Y + // 011 - 000 = 011 | Y | Y + // 100 - 000 = 100 | N | Y + // 101 - 000 = 101 | N | N + // 110 - 000 = 110 | N | N + // 111 - 000 = 111 | N | N + // WriteValid: WritePtr - ReadPtr < 3'd4 + // ReadValid: WritePtr - ReadPtr - 1 < 3'd4 + + always_ff @(posedge clk, negedge nrst) begin: data_in_registering + if (!nrst) begin + data_in_fifo_write_ptr <= 3'b0; + data_in_ready <= 1'b1; + end else if (data_in_fifo_ptr_dif < 3'd4) begin // Space in FIFO + if ((data_in_valid == 1'b1) && (data_in_ready == 1'b1)) begin // Successful Handshake + data_in_fifo [data_in_fifo_write_ptr[1:0]] <= data_in; + data_in_fifo_write_ptr <= data_in_fifo_write_ptr + 3'b1; + if (data_in_fifo_ptr_dif + 3'b1 >= 3'd4) begin // FIFO full with new data written + data_in_ready <= 1'b0; + end else begin // Still space in FIFO after latest write + data_in_ready <= 1'b1; + end + end else begin // Unsuccessful handshake but space in FIFO + data_in_ready <= 1'b1; + end + end else begin // FIFO Full + data_in_ready <= 1'b0; + end + end + + always_ff @(posedge clk, negedge nrst) begin: cfg_registering + if (!nrst) begin + cfg_fifo_write_ptr <= 3'b0; + cfg_ready <= 1'b1; + end else if (cfg_fifo_ptr_dif < 3'd4) begin // Space in FIFO + if ((cfg_valid == 1'b1) && (cfg_ready == 1'b1)) begin // Successful Handshake + cfg_size_fifo [cfg_fifo_write_ptr[1:0]] <= cfg_size; + cfg_scheme_fifo [cfg_fifo_write_ptr[1:0]] <= cfg_scheme; + cfg_fifo_write_ptr <= cfg_fifo_write_ptr + 3'b1; + if (cfg_fifo_ptr_dif + 3'b1 >= 3'd4) begin // FIFO full with new data written + cfg_ready <= 1'b0; + end else begin // Still space in FIFO after latest write + cfg_ready <= 1'b1; + end + end else begin // Unsuccessful handshake but space in FIFO + cfg_ready <= 1'b1; + end + end else begin // FIFO Full + cfg_ready <= 1'b0; + end + end + + // Stage 2: Functional Logic + + // SHA-2 State Machine + logic [1:0] state; + logic [53:0] data_word_count; + logic cfg_word_avail; + logic data_in_word_avail; + + assign cfg_word_avail = ((cfg_fifo_ptr_dif - 3'b1) < 3'd4); // Is there a Config word in the FIFO to read? + assign data_in_word_avail = ((data_in_fifo_ptr_dif - 3'b1) < 3'd4); // Is there a Data In word in the FIFO to read? + + logic [63:0] size_read, size_read_reg; + logic [8:0] size_word_rem, size_word_rem_reg; + logic [53:0] words_to_read, words_to_read_reg; // Number of 512 bit words to read in + logic round_up; + logic extra_word_needed; + logic [511:0] extra_word, extra_word_reg; + + assign size_read = cfg_size_fifo[cfg_fifo_read_ptr_val]; // Extract Size from FIFO + assign size_word_rem = size_read[8:0]; // Remainder of 512 Word Division + assign round_up = |size_word_rem; // Is there a remainder after a 512 division? + assign words_to_read = (size_read >> 9) + round_up; // Total Number of 512 bit words to Read in + assign extra_word_needed = (size_word_rem - 1) > 446; // Extra word needed as not enough space in last word size + + // If extra word needed, extra word is sets the value of the extra word to the value of size and determines + // if message end 1 needs to be put at the beginning of word or not + // If not needed, set to 0 as invalid word (as size can't be 0) - can be detected later + assign extra_word = extra_word_needed ? {~round_up, 447'd0, size_read} : 512'd0; + + logic [511:0] working_data; + logic [511:0] data_in_word_read; + + assign data_in_word_read = data_in_fifo[data_in_fifo_read_ptr_val]; // Extract Data In Word from FIFO + + logic [511:0] last_word_mask; + logic [511:0] end_marker; + logic [511:0] last_data_word; + + assign last_word_mask = |size_word_rem_reg ? ((512'd1 << 512) - 1) << (512 - size_word_rem_reg) : ((512'd1 << 512) - 1); // Create mask to get data from last word + assign end_marker = 1 << (512 - size_word_rem_reg - 1); // "1" to signify end of message + // Combine Last Data with end marker and size + assign last_data_word = (data_in_word_read & last_word_mask) | (|size_word_rem_reg ? end_marker : 512'd0) | (~|extra_word_reg ? size_read_reg : 512'd0); + + always_ff @(posedge clk, negedge nrst) begin: sha_2_next_state + if (!nrst) begin + state <= 2'd0; + data_in_fifo_read_ptr <= 3'b0; + cfg_fifo_read_ptr <= 3'b0; + words_to_read_reg <= 54'd0; + extra_word_reg <= 512'd0; + working_data <= 512'd0; + data_word_count <= 54'd0; + size_read_reg <= 64'd0; + size_word_rem_reg <= 9'd0; + end else begin + case(state) + 2'd0: begin // Initial Config Read + if (cfg_word_avail == 1'b1) begin + size_read_reg <= size_read; + size_word_rem_reg <= size_word_rem; + words_to_read_reg <= words_to_read; + extra_word_reg <= extra_word; + data_word_count <= 54'd0; + cfg_fifo_read_ptr <= cfg_fifo_read_ptr + 3'b1; + state <= state + 2'b1; + end + end + 2'd1: begin // Data Processing Step + if (data_in_word_avail == 1'b1) begin + data_in_fifo_read_ptr <= data_in_fifo_read_ptr + 3'b1; + data_word_count <= data_word_count + 54'd1; + if (data_word_count < (words_to_read_reg - 1)) begin // Not the last word to read + working_data <= data_in_word_read; + end else begin // Last Data In Word to Process + working_data <= last_data_word; + if (|extra_word_reg == 1'b1) begin + state <= state + 2'd1; + end else begin + state <= state + 2'd2; + end + end + end + end + 2'd2: begin // Process Extra Word If Needed + working_data <= extra_word_reg; + state <= state + 2'd1; + end + 2'd3: begin // Write Out Result to Output + state <= 2'd0; + end + default: begin + state <= 2'd0; + end + endcase + end + end + +endmodule \ No newline at end of file diff --git a/hdl/src/sha_2_pkg.sv b/hdl/src/sha_2_pkg.sv new file mode 100644 index 0000000000000000000000000000000000000000..abdf9a69465eb773a5b8df2bb6887b4f398136e9 --- /dev/null +++ b/hdl/src/sha_2_pkg.sv @@ -0,0 +1,137 @@ +//----------------------------------------------------------------------------- +// SoC Labs Basic SHA-2 Engine function and constants SV Package +// 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) +//----------------------------------------------------------------------------- + +package sha_2_pkg; + parameter data_width = 32; + + // SHA-2 Functions + function logic [data_width-1:0] ssig0 ( + logic [data_width-1:0] x); + logic [data_width-1:0] xrotr7, xrotr18, xshr3; + assign xrotr7 = {x[6:0], x[31:7]}; + assign xrotr18 = {x[17:0], x[31:18]}; + assign xshr3 = x >> 3; + assign ssig0 = xrotr7 ^ xrotr18 ^ xshr3; + endfunction + + function logic [data_width-1:0] ssig1 ( + logic [data_width-1:0] x); + logic [data_width-1:0] xrotr17, xrotr19, xshr10; + assign xrotr17 = {x[16:0], x[31:17]}; + assign xrotr19 = {x[18:0], x[31:19]}; + assign xshr10 = x >> 10; + assign ssig1 = xrotr17 ^ xrotr19 ^ xshr10; + endfunction + + function logic [data_width-1:0] bsig0 ( + logic [data_width-1:0] x); + logic [data_width-1:0] xrotr2, xrotr13, xrotr22; + assign xrotr2 = {x[1:0], x[31:2]}; + assign xrotr13 = {x[12:0], x[31:13]}; + assign xrotr22 = {x[21:0], x[31:22]}; + assign bsig0 = xrotr2 ^ xrotr13 ^ xrotr22; + endfunction + + function logic [data_width-1:0] bsig1 ( + logic [data_width-1:0] x); + logic [data_width-1:0] xrotr6, xrotr11, xrotr25; + assign xrotr6 = {x[5:0], x[31:6]}; + assign xrotr11 = {x[10:0], x[31:11]}; + assign xrotr25 = {x[24:0], x[31:25]}; + assign bsig1 = xrotr6 ^ xrotr11 ^ xrotr25; + endfunction + + function logic [data_width-1:0] ch ( + logic [data_width-1:0] x, y, z); + assign ch = (x & y) ^ ((~x) & z); + endfunction + + function logic [data_width-1:0] maj ( + logic [data_width-1:0] x, y, z); + assign maj = (x & y) ^ (x & z) ^ (y & z); + endfunction + + // SHA-2 Constants + const logic [31:0] K0 = 32'h428a2f98; + const logic [31:0] K1 = 32'h71374491; + const logic [31:0] K2 = 32'hb5c0fbcf; + const logic [31:0] K3 = 32'he9b5dba5; + const logic [31:0] K4 = 32'h3956c25b; + const logic [31:0] K5 = 32'h59f111f1; + const logic [31:0] K6 = 32'h923f82a4; + const logic [31:0] K7 = 32'hab1c5ed5; + const logic [31:0] K8 = 32'hd807aa98; + const logic [31:0] K9 = 32'h12835b01; + const logic [31:0] K10 = 32'h243185be; + const logic [31:0] K11 = 32'h550c7dc3; + const logic [31:0] K12 = 32'h72be5d74; + const logic [31:0] K13 = 32'h80deb1fe; + const logic [31:0] K14 = 32'h9bdc06a7; + const logic [31:0] K15 = 32'hc19bf174; + const logic [31:0] K16 = 32'he49b69c1; + const logic [31:0] K17 = 32'hefbe4786; + const logic [31:0] K18 = 32'h0fc19dc6; + const logic [31:0] K19 = 32'h240ca1cc; + const logic [31:0] K20 = 32'h2de92c6f; + const logic [31:0] K21 = 32'h4a7484aa; + const logic [31:0] K22 = 32'h5cb0a9dc; + const logic [31:0] K23 = 32'h76f988da; + const logic [31:0] K24 = 32'h983e5152; + const logic [31:0] K25 = 32'ha831c66d; + const logic [31:0] K26 = 32'hb00327c8; + const logic [31:0] K27 = 32'hbf597fc7; + const logic [31:0] K28 = 32'hc6e00bf3; + const logic [31:0] K29 = 32'hd5a79147; + const logic [31:0] K30 = 32'h06ca6351; + const logic [31:0] K31 = 32'h14292967; + const logic [31:0] K32 = 32'h27b70a85; + const logic [31:0] K33 = 32'h2e1b2138; + const logic [31:0] K34 = 32'h4d2c6dfc; + const logic [31:0] K35 = 32'h53380d13; + const logic [31:0] K36 = 32'h650a7354; + const logic [31:0] K37 = 32'h766a0abb; + const logic [31:0] K38 = 32'h81c2c92e; + const logic [31:0] K39 = 32'h92722c85; + const logic [31:0] K40 = 32'ha2bfe8a1; + const logic [31:0] K41 = 32'ha81a664b; + const logic [31:0] K42 = 32'hc24b8b70; + const logic [31:0] K43 = 32'hc76c51a3; + const logic [31:0] K44 = 32'hd192e819; + const logic [31:0] K45 = 32'hd6990624; + const logic [31:0] K46 = 32'hf40e3585; + const logic [31:0] K47 = 32'h106aa070; + const logic [31:0] K48 = 32'h19a4c116; + const logic [31:0] K49 = 32'h1e376c08; + const logic [31:0] K50 = 32'h2748774c; + const logic [31:0] K51 = 32'h34b0bcb5; + const logic [31:0] K52 = 32'h391c0cb3; + const logic [31:0] K53 = 32'h4ed8aa4a; + const logic [31:0] K54 = 32'h5b9cca4f; + const logic [31:0] K55 = 32'h682e6ff3; + const logic [31:0] K56 = 32'h748f82ee; + const logic [31:0] K57 = 32'h78a5636f; + const logic [31:0] K58 = 32'h84c87814; + const logic [31:0] K59 = 32'h8cc70208; + const logic [31:0] K60 = 32'h90befffa; + const logic [31:0] K61 = 32'ha4506ceb; + const logic [31:0] K62 = 32'hbef9a3f7; + const logic [31:0] K63 = 32'hc67178f2; + + // H_init Constants + const logic [31:0] H0_init = 32'h6a09e667; + const logic [31:0] H1_init = 32'hbb67ae85; + const logic [31:0] H2_init = 32'h3c6ef372; + const logic [31:0] H3_init = 32'ha54ff53a; + const logic [31:0] H4_init = 32'h510e527f; + const logic [31:0] H5_init = 32'h9b05688c; + const logic [31:0] H6_init = 32'h1f83d9ab; + const logic [31:0] H7_init = 32'h5be0cd19; +endpackage \ No newline at end of file diff --git a/hdl/verif/tb_engine.sv b/hdl/verif/tb_engine.sv new file mode 100644 index 0000000000000000000000000000000000000000..28e7f49349c38faa740637dd966efd5e06ece03f --- /dev/null +++ b/hdl/verif/tb_engine.sv @@ -0,0 +1,126 @@ +//----------------------------------------------------------------------------- +// SoC Labs Basic SHA-2 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) +//----------------------------------------------------------------------------- + +`timescale 1ns/1ns +`include "sha_2_engine.sv" +module tb_engine; + + logic clk; + logic nrst; + // Data In data and Handshaking + logic [511:0] data_in; + logic data_in_valid; + logic data_in_ready; + + // Config data and Handshaking + logic [63:0] cfg_size; + logic [1:0] cfg_scheme; + logic cfg_valid; + logic cfg_ready; + + // Data Out data and Handshaking + logic [511:0] data_out; + logic data_out_valid; + logic data_out_ready; + + sha_2_engine uut ( + .clk (clk), + .nrst(nrst), + .data_in(data_in), + .data_in_valid(data_in_valid), + .data_in_ready(data_in_ready), + .cfg_size(cfg_size), + .cfg_scheme(cfg_scheme), + .cfg_valid(cfg_valid), + .cfg_ready(cfg_ready), + .data_out(data_out), + .data_out_valid(data_out_valid), + .data_out_ready(data_out_ready)); + + logic data_in_drive_en; + logic [511:0] data_in_queue [$]; + logic data_in_wait_queue; + + // Handle Valid and Data for data_in + always_ff @(posedge clk, negedge nrst) begin: data_in_valid_drive + if (!nrst) begin + data_in <= 512'd0; + data_in_valid <= 1'b0; + data_in_wait_queue <= 1'b1; + end else if (data_in_drive_en) begin + if (((data_in_valid == 1'b1) && (data_in_ready == 1'b1)) || + (data_in_wait_queue == 1'b1)) begin + // Data transfer just completed or transfers already up to date + if (data_in_queue.size() > 0) begin + data_in <= data_in_queue.pop_front(); + data_in_valid <= 1'b1; + data_in_wait_queue <= 1'b0; + end else begin + // No data currently avaiable in queue to write but transfers up to date + data_in_wait_queue <= 1'b1; + data_in_valid <= 1'b0; + end + end + end + end + + + logic [511:0] temp_data ; + + initial begin + $dumpfile("engine_sim.vcd"); + $dumpvars(0, tb_engine); + + for (int idx = 0; idx < 4; idx = idx + 1) begin + $dumpvars(0, uut.data_in_fifo[idx]); + $dumpvars(0, uut.cfg_size_fifo[idx]); + $dumpvars(0, uut.cfg_scheme_fifo[idx]); + end + + data_in_drive_en = 0; + + for (int idx_1 = 0; idx_1 < 20; idx_1 = idx_1 + 1) begin + for (int idx = 1; idx < 5; idx = idx + 1) begin + data_in_queue.push_back({$urandom(),$urandom(),$urandom(),$urandom(),$urandom(),$urandom(), + $urandom(),$urandom(),$urandom(),$urandom(),$urandom(),$urandom(), + $urandom(),$urandom(),$urandom(),$urandom()}); + end + end + + cfg_size = 0; + cfg_scheme = 0; + cfg_valid = 0; + + data_out_ready = 0; + + #20 nrst = 1; + #20 nrst = 0; + #20 nrst = 1; + #20 data_in_drive_en = 1; + + // Write some data into the config register + # 30 + cfg_size = 512; + cfg_scheme = 2; + cfg_valid = 1; + + #1200 + $display("Test Complete"); + $finish; + end + + initial begin + forever begin + #10 clk = 0; + #10 clk = 1; + end + end +endmodule \ No newline at end of file diff --git a/simulate/simulators/ivlog_sim.sh b/simulate/simulators/ivlog_sim.sh new file mode 100755 index 0000000000000000000000000000000000000000..6c7613cceeb8202597ba6c6e6867b2da55a07a1e --- /dev/null +++ b/simulate/simulators/ivlog_sim.sh @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# SoC Labs icarus verilog 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 $SHA_2_ACC_DIR/simulate/sim/ +iverilog -I $SHA_2_ACC_DIR/hdl/verif/ -I $SHA_2_ACC_DIR/hdl/src/ -g2012 -o $SHA_2_ACC_DIR/simulate/sim/engine_sim.vvp $SHA_2_ACC_DIR/hdl/verif/tb_engine.sv +cd $SHA_2_ACC_DIR/simulate/sim/ && vvp engine_sim.vvp \ No newline at end of file diff --git a/simulate/socsim b/simulate/socsim new file mode 100755 index 0000000000000000000000000000000000000000..586076f83d1b7d2a0cc3d8d6a0e4c2cc5afd4c21 --- /dev/null +++ b/simulate/socsim @@ -0,0 +1,18 @@ +#----------------------------------------------------------------------------- +# SoC Labs socsim script to run required simulation +# 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 + +DEFAULT_SIMULATOR="ivlog" +if [[ -z "${SIMULATOR}" ]]; then + SIMULATOR=$DEFAULT_SIMULATOR +fi +$SHA_2_ACC_DIR"/simulate/simulators/"$SIMULATOR"_sim.sh" diff --git a/sourceme b/sourceme new file mode 100755 index 0000000000000000000000000000000000000000..2d9744889d293a8ddfad92d429125b07e9b02815 --- /dev/null +++ b/sourceme @@ -0,0 +1,21 @@ +#----------------------------------------------------------------------------- +# SoC Labs Environment Setup 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 2022, SoC Labs (www.soclabs.org) +#----------------------------------------------------------------------------- + +#!/usr/bin/env bash + +# Set environment Variables for Repository +export SHA_2_ACC_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" + +# Add simulation directory to Path +export PATH=$PATH:$SHA_2_ACC_DIR/simulate + +# Set Default Simulator +export SIMULATOR="ivlog" \ No newline at end of file