Updates to build and testbenches
diff --git a/crypto-accelerator-chip b/crypto-accelerator-chip
index 92abfa8..ee1de94 160000
--- a/crypto-accelerator-chip
+++ b/crypto-accelerator-chip
@@ -1 +1 @@
-Subproject commit 92abfa8e6441ccae7283f213a5d5c94fb086674b
+Subproject commit ee1de946217a4aefec6b2e984eae455a6fafc00a
diff --git a/openlane/setup.sh b/openlane/setup.sh
index b5440ba..c3b768b 100644
--- a/openlane/setup.sh
+++ b/openlane/setup.sh
@@ -1,2 +1,16 @@
+#SPDX-FileCopyrightText: 2020 Anish Singhani
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the 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.
+# SPDX-License-Identifier: Apache-2.0
#!/bin/sh
cp ../crypto-accelerator-chip/openlane/user_project_wrapper/macro_placement.cfg user_project_wrapper/macro_placement.cfg
diff --git a/verilog/dv/caravel/accelerator/sha256/Makefile b/verilog/dv/caravel/accelerator/sha256/Makefile
new file mode 120000
index 0000000..32961ae
--- /dev/null
+++ b/verilog/dv/caravel/accelerator/sha256/Makefile
@@ -0,0 +1 @@
+../../../../../crypto-accelerator-chip/verilog/dv/caravel/accelerator/sha256/Makefile
\ No newline at end of file
diff --git a/verilog/dv/caravel/accelerator/sha256/printio.h b/verilog/dv/caravel/accelerator/sha256/printio.h
new file mode 120000
index 0000000..b7c61e9
--- /dev/null
+++ b/verilog/dv/caravel/accelerator/sha256/printio.h
@@ -0,0 +1 @@
+../../../../../crypto-accelerator-chip/verilog/dv/caravel/accelerator/sha256/printio.h
\ No newline at end of file
diff --git a/verilog/dv/caravel/accelerator/sha256/sha256.c b/verilog/dv/caravel/accelerator/sha256/sha256.c
new file mode 120000
index 0000000..442c848
--- /dev/null
+++ b/verilog/dv/caravel/accelerator/sha256/sha256.c
@@ -0,0 +1 @@
+../../../../../crypto-accelerator-chip/verilog/dv/caravel/accelerator/sha256/sha256.c
\ No newline at end of file
diff --git a/verilog/dv/caravel/accelerator/sha256/sha256_tb.v b/verilog/dv/caravel/accelerator/sha256/sha256_tb.v
new file mode 120000
index 0000000..fddc05e
--- /dev/null
+++ b/verilog/dv/caravel/accelerator/sha256/sha256_tb.v
@@ -0,0 +1 @@
+../../../../../crypto-accelerator-chip/verilog/dv/caravel/accelerator/sha256/sha256_tb.v
\ No newline at end of file
diff --git a/verilog/dv/caravel/mgmt_soc/gpio/frame-gl.png b/verilog/dv/caravel/mgmt_soc/gpio/frame-gl.png
new file mode 100644
index 0000000..015003f
--- /dev/null
+++ b/verilog/dv/caravel/mgmt_soc/gpio/frame-gl.png
Binary files differ
diff --git a/verilog/dv/caravel/mgmt_soc/gpio/gpio.c b/verilog/dv/caravel/mgmt_soc/gpio/gpio.c
index ae6e621..22e3e85 100644
--- a/verilog/dv/caravel/mgmt_soc/gpio/gpio.c
+++ b/verilog/dv/caravel/mgmt_soc/gpio/gpio.c
@@ -3,8 +3,38 @@
#include "printio.h"
void main() {
- unsigned int s = 0;
- for(int i = 0; i < 10000; i++) s += i;
+ reg_mprj_io_12 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+ reg_mprj_io_13 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+ reg_mprj_io_14 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+
+ reg_mprj_io_15 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_16 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_17 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_18 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_19 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_20 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_21 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_22 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_23 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_24 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_25 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_26 = GPIO_MODE_USER_STD_OUTPUT;
+
+ reg_mprj_io_27 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+ reg_mprj_io_28 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+ reg_mprj_io_29 = GPIO_MODE_USER_STD_INPUT_NOPULL;
+
+ reg_mprj_io_30 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_31 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_32 = GPIO_MODE_USER_STD_OUTPUT;
+
+ reg_mprj_xfer = 1;
+ while (reg_mprj_xfer == 1);
+
+ //unsigned int x = 0;
+ //for(int i = 0; i < 10000; i++) x += i;
+ //printhex(x, true);
+
printstr("test\n");
printstr((char*)0x30000050);
printstr("\n");
diff --git a/verilog/dv/caravel/mgmt_soc/gpio/gpio_tb.v b/verilog/dv/caravel/mgmt_soc/gpio/gpio_tb.v
index f46fee9..ee5fbc6 100644
--- a/verilog/dv/caravel/mgmt_soc/gpio/gpio_tb.v
+++ b/verilog/dv/caravel/mgmt_soc/gpio/gpio_tb.v
@@ -36,12 +36,17 @@
clock <= 0;
end
+ wire [37:0] mprj_io; // Most of these are no-connects
+ wire gpio;
+ reg RSTB;
+
+ wire [40:0] dump = {clock, RSTB, gpio, mprj_io};
initial begin
$dumpfile("gpio.vcd");
- $dumpvars(0, gpio_tb);
+ $dumpvars(0, dump);
// Repeat cycles of 1000 clock edges as needed to complete testbench
- repeat (25) begin
+ repeat (40) begin
repeat (1000) @(posedge clock);
$display("+1000 cycles");
end
@@ -55,7 +60,6 @@
$finish;
end
- wire [37:0] mprj_io; // Most of these are no-connects
wire [15:0] checkbits;
reg [7:0] checkbits_lo;
wire [7:0] checkbits_hi;
@@ -69,9 +73,6 @@
wire flash_clk;
wire flash_io0;
wire flash_io1;
- wire gpio;
-
- reg RSTB;
// Transactor
initial begin
diff --git a/verilog/dv/caravel/mgmt_soc/gpio/printio.h b/verilog/dv/caravel/mgmt_soc/gpio/printio.h
index 94da39d..6568366 100644
--- a/verilog/dv/caravel/mgmt_soc/gpio/printio.h
+++ b/verilog/dv/caravel/mgmt_soc/gpio/printio.h
@@ -9,55 +9,55 @@
}
void setup_out() {
- reg_mprj_io_7 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_6 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_5 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_4 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_3 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_2 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_1 = GPIO_MODE_MGMT_STD_OUTPUT;
- reg_mprj_io_0 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_17 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_16 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_15 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_14 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_13 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_12 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_11 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_10 = GPIO_MODE_MGMT_STD_OUTPUT;
reg_mprj_xfer = 1;
while (reg_mprj_xfer == 1);
}
void write_char(char c) {
- uint32_t tmp7 = reg_mprj_io_7;
- uint32_t tmp6 = reg_mprj_io_6;
- uint32_t tmp5 = reg_mprj_io_5;
- uint32_t tmp4 = reg_mprj_io_4;
- uint32_t tmp3 = reg_mprj_io_3;
- uint32_t tmp2 = reg_mprj_io_2;
- uint32_t tmp1 = reg_mprj_io_1;
- uint32_t tmp0 = reg_mprj_io_0;
+ uint32_t tmp7 = reg_mprj_io_17;
+ uint32_t tmp6 = reg_mprj_io_16;
+ uint32_t tmp5 = reg_mprj_io_15;
+ uint32_t tmp4 = reg_mprj_io_14;
+ uint32_t tmp3 = reg_mprj_io_13;
+ uint32_t tmp2 = reg_mprj_io_12;
+ uint32_t tmp1 = reg_mprj_io_11;
+ uint32_t tmp0 = reg_mprj_io_10;
setup_out();
shift_char(c);
- reg_mprj_io_7 = tmp7;
- reg_mprj_io_6 = tmp6;
- reg_mprj_io_5 = tmp5;
- reg_mprj_io_4 = tmp4;
- reg_mprj_io_3 = tmp3;
- reg_mprj_io_2 = tmp2;
- reg_mprj_io_1 = tmp1;
- reg_mprj_io_0 = tmp0;
+ reg_mprj_io_17 = tmp7;
+ reg_mprj_io_16 = tmp6;
+ reg_mprj_io_15 = tmp5;
+ reg_mprj_io_14 = tmp4;
+ reg_mprj_io_13 = tmp3;
+ reg_mprj_io_12 = tmp2;
+ reg_mprj_io_11 = tmp1;
+ reg_mprj_io_10 = tmp0;
reg_mprj_xfer = 1;
while (reg_mprj_xfer == 1);
}
void printhex(uint32_t x, bool newline) {
- uint32_t tmp7 = reg_mprj_io_7;
- uint32_t tmp6 = reg_mprj_io_6;
- uint32_t tmp5 = reg_mprj_io_5;
- uint32_t tmp4 = reg_mprj_io_4;
- uint32_t tmp3 = reg_mprj_io_3;
- uint32_t tmp2 = reg_mprj_io_2;
- uint32_t tmp1 = reg_mprj_io_1;
- uint32_t tmp0 = reg_mprj_io_0;
+ uint32_t tmp7 = reg_mprj_io_17;
+ uint32_t tmp6 = reg_mprj_io_16;
+ uint32_t tmp5 = reg_mprj_io_15;
+ uint32_t tmp4 = reg_mprj_io_14;
+ uint32_t tmp3 = reg_mprj_io_13;
+ uint32_t tmp2 = reg_mprj_io_12;
+ uint32_t tmp1 = reg_mprj_io_11;
+ uint32_t tmp0 = reg_mprj_io_10;
setup_out();
@@ -69,42 +69,42 @@
}
if(newline) shift_char('\n');
- reg_mprj_io_7 = tmp7;
- reg_mprj_io_6 = tmp6;
- reg_mprj_io_5 = tmp5;
- reg_mprj_io_4 = tmp4;
- reg_mprj_io_3 = tmp3;
- reg_mprj_io_2 = tmp2;
- reg_mprj_io_1 = tmp1;
- reg_mprj_io_0 = tmp0;
+ reg_mprj_io_17 = tmp7;
+ reg_mprj_io_16 = tmp6;
+ reg_mprj_io_15 = tmp5;
+ reg_mprj_io_14 = tmp4;
+ reg_mprj_io_13 = tmp3;
+ reg_mprj_io_12 = tmp2;
+ reg_mprj_io_11 = tmp1;
+ reg_mprj_io_10 = tmp0;
reg_mprj_xfer = 1;
while (reg_mprj_xfer == 1);
}
void printstr(char *str) {
- uint32_t tmp7 = reg_mprj_io_7;
- uint32_t tmp6 = reg_mprj_io_6;
- uint32_t tmp5 = reg_mprj_io_5;
- uint32_t tmp4 = reg_mprj_io_4;
- uint32_t tmp3 = reg_mprj_io_3;
- uint32_t tmp2 = reg_mprj_io_2;
- uint32_t tmp1 = reg_mprj_io_1;
- uint32_t tmp0 = reg_mprj_io_0;
+ uint32_t tmp7 = reg_mprj_io_17;
+ uint32_t tmp6 = reg_mprj_io_16;
+ uint32_t tmp5 = reg_mprj_io_15;
+ uint32_t tmp4 = reg_mprj_io_14;
+ uint32_t tmp3 = reg_mprj_io_13;
+ uint32_t tmp2 = reg_mprj_io_12;
+ uint32_t tmp1 = reg_mprj_io_11;
+ uint32_t tmp0 = reg_mprj_io_10;
setup_out();
char c;
while (*str) shift_char(*str++);
- reg_mprj_io_7 = tmp7;
- reg_mprj_io_6 = tmp6;
- reg_mprj_io_5 = tmp5;
- reg_mprj_io_4 = tmp4;
- reg_mprj_io_3 = tmp3;
- reg_mprj_io_2 = tmp2;
- reg_mprj_io_1 = tmp1;
- reg_mprj_io_0 = tmp0;
+ reg_mprj_io_17 = tmp7;
+ reg_mprj_io_16 = tmp6;
+ reg_mprj_io_15 = tmp5;
+ reg_mprj_io_14 = tmp4;
+ reg_mprj_io_13 = tmp3;
+ reg_mprj_io_12 = tmp2;
+ reg_mprj_io_11 = tmp1;
+ reg_mprj_io_10 = tmp0;
reg_mprj_xfer = 1;
while (reg_mprj_xfer == 1);
diff --git a/verilog/gl/user_project_wrapper.v b/verilog/gl/user_project_wrapper.v
index 9966cfd..a944d9c 100644
--- a/verilog/gl/user_project_wrapper.v
+++ b/verilog/gl/user_project_wrapper.v
@@ -1,6 +1,6 @@
/* Generated by Yosys 0.9+3621 (git sha1 84e9fa7, gcc 8.3.1 -fPIC -Os) */
-module user_project_wrapper(user_clock2, wb_clk_i, wb_rst_i, wbs_ack_o, wbs_cyc_i, wbs_stb_i, wbs_we_i, vccd1, vssd1, vccd2, vssd2, vdda1, vssa1, vdda2, vssa2, analog_io, io_in, io_oeb, io_out, la_data_in, la_data_out, la_oen, wbs_adr_i, wbs_dat_i, wbs_dat_o, wbs_sel_i);
+module user_project_wrapper(wb_clk_i, wb_rst_i, wbs_stb_i, wbs_cyc_i, wbs_we_i, wbs_sel_i, wbs_dat_i, wbs_adr_i, wbs_ack_o, wbs_dat_o, la_data_in, la_data_out, la_oen, io_in, io_out, io_oeb, analog_io, user_clock2);
inout [30:0] analog_io;
input [37:0] io_in;
output [37:0] io_oeb;
@@ -9,14 +9,6 @@
output [127:0] la_data_out;
input [127:0] la_oen;
input user_clock2;
- input vccd1;
- input vccd2;
- input vdda1;
- input vdda2;
- input vssa1;
- input vssa2;
- input vssd1;
- input vssd2;
input wb_clk_i;
input wb_rst_i;
output wbs_ack_o;
@@ -34,14 +26,6 @@
.la_data_in(la_data_in),
.la_data_out(la_data_out),
.la_oen(la_oen),
- .vccd1(vccd1),
- .vccd2(vccd2),
- .vdda1(vdda1),
- .vdda2(vdda2),
- .vssa1(vssa1),
- .vssa2(vssa2),
- .vssd1(vssd1),
- .vssd2(vssd2),
.wb_clk_i(wb_clk_i),
.wb_rst_i(wb_rst_i),
.wbs_ack_o(wbs_ack_o),
diff --git a/verilog/rtl/manifest b/verilog/rtl/manifest
index a79b82a..7d42170 100644
--- a/verilog/rtl/manifest
+++ b/verilog/rtl/manifest
@@ -1,10 +1,11 @@
b2feeb2a098894d5d731a5b011858a471e855d73 caravel_clocking.v
-c39b4f6a67a044aec105ca83ef1eb6d3f2b06028 caravel.v
+fd381372c7120ced342867572a327fc4e38fc566 caravel.v
38d2c674ea1f696bf2c9deaeee5f9b044f2445fb chip_io.v
d772308bd2a72121d7ed9dcdd40c8e6cbbe4b43c clock_div.v
f937b52e53d45bdbe41bcbd07c65b41104c21756 convert_gpio_sigs.v
a16f89c8efa638eab43641ab7047bb8eeedd6fa6 counter_timer_high.v
d8eab2f4cef158e3c7800778ffc2367ab4abe130 counter_timer_low.v
+d8e0e88c860f1285e6ac6f4726f0726fc75e4858 defines.v
dab57f3c5464ce3354219840dae589a3fcd27135 DFFRAMBB.v
d328f88dd48e015bbaa95e0d7c88954343cc5632 DFFRAM.v
ce49f9af199b5f16d2c39c417d58e5890bc7bab2 digital_pll_controller.v
@@ -29,9 +30,11 @@
917aa6e1bb869f973c79fb2c7894eab882ead74c simple_spi_master.v
7a949db8a5665540e0125bfb7544852167e821b0 simpleuart.v
ec5fa62d935e1139de104b9201740020fdea4a17 sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v
-b77b7eb6ae4b253abf157a01f6f349719a81628c spimemio.v
+75dd8e88e3c550d396f6900cd5f335ec30e07fb1 spimemio.v
3b4c3de623f8af0f0780f1e5b0f2217ef6406a2f sram_1rw1r_32_256_8_sky130.v
7e8d789570ed224df49cf61f69593cc738790a5d storage_bridge_wb.v
8dea2030f1f59fc58ce50d943c395b8041ff1fb3 storage.v
5e314e94a13d7291117123395ae088e1d17cf487 sysctrl.v
+ba45c454d03c4798e0cff4ee00fe8ebd1c23d054 user_id_programming.v
+e77f840421d118db4cc3674e453e71ec49754907 user_project_wrapper.v
e6246df6bbf0860a331b3547d64f7d235b0eca9a wb_intercon.v
diff --git a/verilog/rtl/spimemio.v b/verilog/rtl/spimemio.v
index dc37126..7a21cb0 100644
--- a/verilog/rtl/spimemio.v
+++ b/verilog/rtl/spimemio.v
@@ -73,6 +73,69 @@
input flash_io3_di
);
+
+`ifdef SPOOF_FAST_FLASH
+ assign wb_cfg_ack_o = 0;
+ assign wb_cfg_dat_o = 0;
+
+ assign pass_thru_sdo = 0;
+ assign flash_csb = 0;
+ assign flash_clk = 0;
+ assign flash_csb_oeb = 0;
+ assign flash_clk_oeb = 0;
+ assign flash_io0_oeb = 0;
+ assign flash_io1_oeb = 0;
+ assign flash_io2_oeb = 0;
+ assign flash_io3_oeb = 0;
+ assign flash_csb_ieb = 0;
+ assign flash_clk_ieb = 0;
+ assign flash_io0_ieb = 0;
+ assign flash_io1_ieb = 0;
+ assign flash_io2_ieb = 0;
+ assign flash_io3_ieb = 0;
+ assign flash_io0_do = 0;
+ assign flash_io1_do = 0;
+ assign flash_io2_do = 0;
+ assign flash_io3_do = 0;
+
+ // 16 MB (128Mb) Flash
+ reg [7:0] memory [0:16*1024*1024-1];
+
+ reg ack_reg;
+ reg [31:0] dat_reg;
+
+ assign wb_flash_ack_o = ack_reg;
+ assign wb_flash_dat_o = dat_reg;
+
+ wire [31:0] adr = {7'b0, wb_adr_i[23:0]};
+
+ initial begin
+ $display("============================================================");
+ $display("Spoofing flash from file %s", `SPOOF_FAST_FLASH);
+ $display("Warning: this is experimental and \ndoes not match exact hardware behavior");
+ $display("(assumes that flash base is a multiple of 0x1000000)");
+ $display("============================================================");
+ $readmemh(`SPOOF_FAST_FLASH, memory);
+ end
+
+ always @(posedge wb_clk_i) begin
+ if (wb_cyc_i & wb_cfg_stb_i) $error("wb_cfg_stb_i unsupported in SPOOF_FAST_FLASH mode. Please use normal flash emulation.");
+ if (pass_thru) $error("pass_thru unsupported in SPOOF_FAST_FLASH mode. Please use normal flash emulation.");
+
+ ack_reg <= 0;
+
+ if (wb_cyc_i & wb_flash_stb_i & ~wb_flash_ack_o) begin
+ ack_reg <= 1;
+ dat_reg <= {memory[adr+3], memory[adr+2], memory[adr+1], memory[adr+0]};
+
+ if (wb_we_i & wb_sel_i[0]) memory[adr+0] <= wb_dat_i[7:0];
+ if (wb_we_i & wb_sel_i[1]) memory[adr+1] <= wb_dat_i[15:8];
+ if (wb_we_i & wb_sel_i[2]) memory[adr+2] <= wb_dat_i[23:16];
+ if (wb_we_i & wb_sel_i[3]) memory[adr+3] <= wb_dat_i[31:24];
+ end
+ end
+
+`else
wire spimem_ready;
wire [23:0] mem_addr;
wire [31:0] spimem_rdata;
@@ -141,6 +204,7 @@
.pass_thru_sdi(pass_thru_sdi),
.pass_thru_sdo(pass_thru_sdo)
);
+`endif
endmodule