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