Merge "[HW][ml_top] Fix lint for undriven inputs."
diff --git a/hw/top_matcha/data/clocks_nexus.xdc b/hw/top_matcha/data/clocks_nexus.xdc
index 7035428..74cbd85 100644
--- a/hw/top_matcha/data/clocks_nexus.xdc
+++ b/hw/top_matcha/data/clocks_nexus.xdc
@@ -5,6 +5,12 @@
## Clock Signal
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports IO_CLK]
+## Rename MMCM outputs for less bug-prone parsing.
+## Some auto-derived clocks can have names that include brackets.
+create_generated_clock -name clk_main [get_pin clkgen/pll/CLKOUT0]
+create_generated_clock -name clk_usb_48 [get_pin clkgen/pll/CLKOUT1]
+create_generated_clock -name clk_aon [get_pin clkgen/pll/CLKOUT4]
+
## Clock Domain Crossings
set clks_10_unbuf [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]]
set clks_48_unbuf [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT1]]
@@ -20,8 +26,10 @@
#Recommended Div4 clock constraints from Xilinx
#TODO uncomment below line and integrate u_div4 in path to make constraint more generic
-#set u_div4 top_*/u_clkmgr_aon/u_no_scan_io_div4_div
-create_generated_clock -name clkDiv4 -divide_by 4 -source [get_pins top_matcha/u_clkmgr_aon/u_no_scan_io_div4_div/gen_div.clk_int_reg/C] [get_pins top_matcha/u_clkmgr_aon/u_no_scan_io_div4_div/gen_div.clk_int_reg/Q]
+set u_div4 top_*/u_clkmgr_aon/u_no_scan_io_div4_div
+create_generated_clock -name clkDiv4 -divide_by 4 -source [get_pins ${u_div4}/gen_div.clk_int_reg/C] [get_pins ${u_div4}/gen_div.clk_int_reg/Q]
+
+#
# the step-down mux is implemented with a LUT right now and the mux switches on the falling edge.
# therefore, Vivado propagates both clock edges down the clock network.
@@ -39,45 +47,39 @@
create_clock -add -name rv_jtag_tck -period 200.00 -waveform {0 5} [get_pin top_*/u_pinmux_aon/u_pinmux_strap_sampling/u_pinmux_jtag_buf_rv/prim_clock_buf_tck/gen_xilinx.u_impl_xilinx/gen_fpga_buf.gen_bufg.bufg_i/O]
## SPI clocks
+set spi_dev_data [get_ports {SPI_DEV_D0 SPI_DEV_D1 SPI_DEV_D2 SPI_DEV_D3}]
create_clock -add -name clk_spi -period 100.00 -waveform {0 50} [get_ports SPI_DEV_CLK]
create_clock -add -name clk_cs -period 1000.00 -waveform {0 50} [get_ports SPI_DEV_CS_L]
-set_input_delay -clock clk_spi 5 [get_ports SPI_DEV_D0]
-set_input_delay -clock clk_spi 5 [get_ports SPI_DEV_D1]
-set_input_delay -clock clk_spi 5 [get_ports SPI_DEV_D2]
-set_input_delay -clock clk_spi 5 [get_ports SPI_DEV_D3]
-set_input_delay -clock clk_spi 5 [get_ports SPI_DEV_CS_L]
-set_output_delay -clock clk_spi 5 [get_ports SPI_DEV_D0] -add_delay
-set_output_delay -clock clk_spi 5 [get_ports SPI_DEV_D1] -add_delay
-set_output_delay -clock clk_spi 5 [get_ports SPI_DEV_D2] -add_delay
-set_output_delay -clock clk_spi 5 [get_ports SPI_DEV_D3] -add_delay
+set_input_delay -clock clk_spi 5 ${spi_dev_data} -add_delay
+set_output_delay -clock clk_spi 5 ${spi_dev_data} -add_delay
+# set_input_delay -clock clk_spi -clock_fall -min ${spi_dev_in_delay_min} ${spi_dev_data} -add_delay
+# set_input_delay -clock clk_spi -clock_fall -max ${spi_dev_in_delay_max} ${spi_dev_data} -add_delay
## Camera Clock
#8-bit, QVGA 60FPS @ 6MHz > setting to 10M to keep numbers round
#create_clock -add -name clk_cam_pclk -period 100.00 -waveform {0 50} [get_ports ISP_DVP_PCLK]
##SPI Host IO Delay
-set_input_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_D0]
-set_input_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_D1]
-set_input_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_D2]
-set_input_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_D3]
-set_input_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_CLK]
-set_input_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_CS_L]
-set_output_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_D0]
-set_output_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_D1]
-set_output_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_D2]
-set_output_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_D3]
-set_output_delay -clock [get_clocks -of_objects [get_pin clkgen/pll/CLKOUT0]] 5 [get_ports SPI_HOST_CS_L]
+## SPI Passthrough constraints
+create_generated_clock -name clk_spi_pt -divide_by 1 -source [get_ports SPI_DEV_CLK] [get_ports SPI_HOST_CLK]
+set spi_pt_data [get_ports {SPI_HOST_D0 SPI_HOST_D1 SPI_HOST_D2 SPI_HOST_D3}]
+set_input_delay -clock clk_spi_pt -clock_fall 7 ${spi_pt_data} -add_delay
+
+set_output_delay -clock clk_spi_pt 7 ${spi_pt_data} -add_delay
+set_output_delay -clock clk_spi_pt 7 [get_ports SPI_HOST_CS_L] -add_delay
+
## GPIO IO Delay
-set_input_delay -clock clkDiv4 5 [get_ports IOA*]
-set_input_delay -clock clkDiv4 5 [get_ports IOB*]
-set_input_delay -clock clkDiv4 5 [get_ports IOC*]
-set_input_delay -clock clkDiv4 5 [get_ports IOR*]
-set_output_delay -clock clkDiv4 5 [get_ports IOA*]
-set_output_delay -clock clkDiv4 5 [get_ports IOB*]
-set_output_delay -clock clkDiv4 5 [get_ports IOC*]
-set_output_delay -clock clkDiv4 5 [get_ports IOR*]
+set ioa_muxed_ports [get_ports IOA*]
+set iob_muxed_ports [get_ports IOB*]
+set ioc_muxed_ports [get_ports IOC*]
+set ioc_muxed_ports [get_ports IOD*]
+set ior_muxed_ports [get_ports -filter {NAME != IOR8 && NAME != IOR9} IOR*]
+set all_muxed_ports "${ioa_muxed_ports} ${iob_muxed_ports} ${ioc_muxed_ports} ${ior_muxed_ports}"
+
+set_input_delay -clock clkDiv4 5 [get_ports ${all_muxed_ports}]
+set_output_delay -clock clkDiv4 5 [get_ports ${all_muxed_ports}]
create_generated_clock -name clk_i2s_rx -divide_by 22 -source [get_pin ${u_pll}/CLKOUT1] [get_pins top_matcha/u_i2s0/i2s_core/bufg_rx_audio_clk/gen_xilinx.u_impl_xilinx/gen_fpga_buf.gen_bufg.bufg_i/O]
create_generated_clock -name clk_i2s_tx -divide_by 22 -source [get_pin ${u_pll}/CLKOUT1] [get_pins top_matcha/u_i2s0/i2s_core/bufg_tx_audio_clk/gen_xilinx.u_impl_xilinx/gen_fpga_buf.gen_bufg.bufg_i/O]
@@ -108,4 +110,16 @@
create_generated_clock -name clk_spi_in -divide_by 1 -source [get_ports SPI_DEV_CLK] [get_pins top_*/u_spi_device/u_clk_spi_in_buf/gen_xilinx.u_impl_xilinx/gen_fpga_buf.gen_bufr.bufr_i/O]
create_generated_clock -name clk_spi_out -divide_by 1 -source [get_ports SPI_DEV_CLK] [get_pins top_*/u_spi_device/u_clk_spi_out_buf/gen_xilinx.u_impl_xilinx/gen_fpga_buf.gen_bufr.bufr_i/O] -invert
-set_clock_groups -group ${clks_10_unbuf} -group ${clks_48_unbuf} -group ${clks_aon_unbuf} -group clk_io_div2 -group clkDiv4 -group lc_jtag_tck -group rv_jtag_tck -group {clk_spi clk_spi_in clk_spi_out} -group clk_cs -group sys_clk_pin -group clk_i2s_rx -group clk_i2s_tx -asynchronous
+set_clock_groups -asynchronous \
+ -group ${clks_10_unbuf} \
+ -group ${clks_48_unbuf} \
+ -group ${clks_aon_unbuf} \
+ -group clk_io_div2 \
+ -group clkDiv4 \
+ -group lc_jtag_tck \
+ -group rv_jtag_tck \
+ -group {clk_spi clk_spi_in clk_spi_out clk_spi_pt} \
+ -group clk_cs \
+ -group sys_clk_pin \
+ -group clk_i2s_rx \
+ -group clk_i2s_tx
diff --git a/hw/top_matcha/data/pins_nexus.xdc b/hw/top_matcha/data/pins_nexus.xdc
index 748e430..8a7083a 100644
--- a/hw/top_matcha/data/pins_nexus.xdc
+++ b/hw/top_matcha/data/pins_nexus.xdc
@@ -87,14 +87,14 @@
set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS18 PULLTYPE PULLUP } [ get_ports { IOC12 }]; #RSTB (FLASH1_RSTB)
## Nexus PMOD3 connect to interace Connector (J263, 3.3V through level shifter), Bank62 LVCMOS18
-#set_property -dict { PACKAGE_PIN AU40 IOSTANDARD LVCMOS18 } [get_ports { IOC2 }]; #PMOD3_1_FPGA
-#set_property -dict { PACKAGE_PIN AV40 IOSTANDARD LVCMOS18 } [get_ports { IOC3 }]; #PMOD3_2_FPGA USED FOR UART to match nexus
-#set_property -dict { PACKAGE_PIN AW40 IOSTANDARD LVCMOS18 } [get_ports { IOC4 }]; #PMOD3_3_FPGA USED FOR UART to match nexus
-set_property -dict { PACKAGE_PIN AY39 IOSTANDARD LVCMOS18 } [get_ports { IOA0 }]; #PMOD3_4_FPGA IOA0 moved for IOC8 TAP0
-set_property -dict { PACKAGE_PIN AU39 IOSTANDARD LVCMOS18 } [get_ports { IOC6 }]; #PMOD3_7_FPGA
-set_property -dict { PACKAGE_PIN AV39 IOSTANDARD LVCMOS18 } [get_ports { IOC7 }]; #PMOD3_8_FPGA
-set_property -dict { PACKAGE_PIN AW37 IOSTANDARD LVCMOS18 } [get_ports { IOA1 }]; #PMOD3_9_FPGA IOA1 moved for IOC5 TAP1
-set_property -dict { PACKAGE_PIN AW38 IOSTANDARD LVCMOS18 } [get_ports { IOC9 }]; #PMOD3_10_FPGA
+set_property -dict { PACKAGE_PIN AU40 IOSTANDARD LVCMOS18 } [get_ports { IOD0 }]; #PMOD3_1_FPGA
+set_property -dict { PACKAGE_PIN AV40 IOSTANDARD LVCMOS18 } [get_ports { IOD1 }]; #PMOD3_2_FPGA
+set_property -dict { PACKAGE_PIN AW40 IOSTANDARD LVCMOS18 } [get_ports { IOD2 }]; #PMOD3_3_FPGA
+set_property -dict { PACKAGE_PIN AY39 IOSTANDARD LVCMOS18 } [get_ports { IOD3 }]; #PMOD3_4_FPGA
+set_property -dict { PACKAGE_PIN AU39 IOSTANDARD LVCMOS18 } [get_ports { IOD4 }]; #PMOD3_7_FPGA
+set_property -dict { PACKAGE_PIN AV39 IOSTANDARD LVCMOS18 } [get_ports { IOD5 }]; #PMOD3_8_FPGA
+# set_property -dict { PACKAGE_PIN AW37 IOSTANDARD LVCMOS18 } [get_ports { IOA1 }]; #PMOD3_9_FPGA
+# set_property -dict { PACKAGE_PIN AW38 IOSTANDARD LVCMOS18 } [get_ports { IOC9 }]; #PMOD3_10_FPGA
## Parallel Camera Nexus SMC J14 pins for HPS
@@ -129,12 +129,12 @@
set_property -dict { PACKAGE_PIN AM32 IOSTANDARD LVCMOS18 } [get_ports { IOB7 }]; #PMOD1_4_FPGA -ISP_DVP_D7
set_property -dict { PACKAGE_PIN AN33 IOSTANDARD LVCMOS18 } [get_ports { IOB8 }]; #PMOD2_1_FPGA -ISP_DVP_PCLK
#set_property -dict { PACKAGE_PIN AN34 IOSTANDARD LVCMOS18 } [get_ports { ISP_DVP_MCLK }]; #PMOD2_7_FPGA -ISP_DVP_MCLK
-set_property -dict { PACKAGE_PIN AM31 IOSTANDARD LVCMOS18 } [get_ports { IOA2 }]; #PMOD2_2_FPGA -ISP_DVP_VSYNC
-set_property -dict { PACKAGE_PIN AP33 IOSTANDARD LVCMOS18 } [get_ports { IOA3 }]; #PMOD2_8_FPGA -ISP_DVP_HSYNC
-set_property -dict { PACKAGE_PIN AR35 IOSTANDARD LVCMOS18 } [get_ports { IOA4 }]; #PCAM_SCL/PMOD2_9_FPGA -CAM_SCL
-set_property -dict { PACKAGE_PIN AT35 IOSTANDARD LVCMOS18 } [get_ports { IOA5 }]; #PCAM_SDA/PMOD2_3_FPGA -CAM_SDA
-set_property -dict { PACKAGE_PIN AT36 IOSTANDARD LVCMOS18 } [get_ports { IOA6 }]; #PMOD2_4_FPGA -CAM_INT
-set_property -dict { PACKAGE_PIN AT37 IOSTANDARD LVCMOS18 } [get_ports { IOA7 }]; #PMOD2_10_FPGA -CAM_TRIG
+set_property -dict { PACKAGE_PIN AM31 IOSTANDARD LVCMOS18 } [get_ports { IOA2 }]; #PMOD2_2_FPGA -ISP_DVP_VSYNC
+set_property -dict { PACKAGE_PIN AP33 IOSTANDARD LVCMOS18 } [get_ports { IOA3 }]; #PMOD2_8_FPGA -ISP_DVP_HSYNC
+set_property -dict { PACKAGE_PIN AR35 IOSTANDARD LVCMOS18 } [get_ports { IOA4 }]; #PCAM_SCL/PMOD2_9_FPGA -CAM_SCL
+set_property -dict { PACKAGE_PIN AT35 IOSTANDARD LVCMOS18 } [get_ports { IOA5 }]; #PCAM_SDA/PMOD2_3_FPGA -CAM_SDA
+set_property -dict { PACKAGE_PIN AT36 IOSTANDARD LVCMOS18 } [get_ports { IOA6 }]; #PMOD2_4_FPGA -CAM_INT
+set_property -dict { PACKAGE_PIN AT37 IOSTANDARD LVCMOS18 } [get_ports { IOA7 }]; #PMOD2_10_FPGA -CAM_TRIG
@@ -143,25 +143,25 @@
set_property -dict { PACKAGE_PIN AY38 IOSTANDARD LVCMOS18 } [get_ports { IOB10 }]; #PMOD4_1_FPGA -SPI_HOST2_D0
set_property -dict { PACKAGE_PIN BA39 IOSTANDARD LVCMOS18 } [get_ports { IOB11 }]; #PMOD4_2_FPGA -SPI_HOST2_D1
set_property -dict { PACKAGE_PIN AW35 IOSTANDARD LVCMOS18 } [get_ports { IOB12 }]; #PMOD4_3_FPGA -SPI_HOST2_D2
-set_property -dict { PACKAGE_PIN AY35 IOSTANDARD LVCMOS18 } [get_ports { IOR11 }]; #PMOD4_4_FPGA -SPI_HOST2_D3
-set_property -dict { PACKAGE_PIN AY40 IOSTANDARD LVCMOS18 } [get_ports { IOR12 }]; #PMOD4_7_FPGA -SPI_HOST2_CLK
+set_property -dict { PACKAGE_PIN AY35 IOSTANDARD LVCMOS18 } [get_ports { IOR11 }]; #PMOD4_4_FPGA -SPI_HOST2_D3
+set_property -dict { PACKAGE_PIN AY40 IOSTANDARD LVCMOS18 } [get_ports { IOR12 }]; #PMOD4_7_FPGA -SPI_HOST2_CLK
set_property -dict { PACKAGE_PIN BA40 IOSTANDARD LVCMOS18 } [get_ports { IOR13 }]; #PMOD4_8_FPGA -SPI_HOST2_CS_L
#set_property -dict { PACKAGE_PIN AW36 IOSTANDARD LVCMOS18 } [get_ports { IOB7 }]; #PMOD4_9_FPGA
#set_property -dict { PACKAGE_PIN BC40 IOSTANDARD LVCMOS18 } [get_ports { IOB8 }]; #PMOD4_10_FPGA
##OLD## J271 pins for prototyping. Bank 63 -- IOB7/8 previously for display control moved. IOD0/1 will be used for display control signals for demo.
-set_property -dict { PACKAGE_PIN AK30 IOSTANDARD LVCMOS18 } [get_ports { IOD0 }]; #EXP1x10_J271_P1
-set_property -dict { PACKAGE_PIN AJ30 IOSTANDARD LVCMOS18 } [get_ports { IOD1 }]; #EXP1x10_J271_P3
-set_property -dict { PACKAGE_PIN AH30 IOSTANDARD LVCMOS18 } [get_ports { IOD2 }]; #EXP1x10_J271_P5
-set_property -dict { PACKAGE_PIN AJ31 IOSTANDARD LVCMOS18 } [get_ports { IOD3 }]; #EXP1x10_J271_P7
-set_property -dict { PACKAGE_PIN AG31 IOSTANDARD LVCMOS18 } [get_ports { IOD4 }]; #EXP1x10_J271_P9
-set_property -dict { PACKAGE_PIN AH31 IOSTANDARD LVCMOS18 } [get_ports { IOD5 }]; #EXP1x10_J271_P11
-# set_property -dict { PACKAGE_PIN AG32 IOSTANDARD LVCMOS18 } [get_ports { xx }]; #EXP1x10_J271_P13
+# set_property -dict { PACKAGE_PIN AK30 IOSTANDARD LVCMOS18 } [get_ports { xx }]; #EXP1x10_J271_P1
+# set_property -dict { PACKAGE_PIN AJ30 IOSTANDARD LVCMOS18 } [get_ports { xx }]; #EXP1x10_J271_P3
+# set_property -dict { PACKAGE_PIN AH30 IOSTANDARD LVCMOS18 } [get_ports { xx }]; #EXP1x10_J271_P5
+# set_property -dict { PACKAGE_PIN AJ31 IOSTANDARD LVCMOS18 } [get_ports { xx }]; #EXP1x10_J271_P7
+# set_property -dict { PACKAGE_PIN AG31 IOSTANDARD LVCMOS18 } [get_ports { xx }]; #EXP1x10_J271_P9
+# set_property -dict { PACKAGE_PIN AH31 IOSTANDARD LVCMOS18 } [get_ports { xx }]; #EXP1x10_J271_P11
+# set_property -dict { PACKAGE_PIN AG32 IOSTANDARD LVCMOS18 } [get_ports { xx }]; #EXP1x10_J271_P13
#EXP1x10_J271_P19 held by IO_UPHY_DPPULLUP
#EXP1x10_J271_P17 unused
-# set_property -dict { PACKAGE_PIN AG33 IOSTANDARD LVCMOS18 } [get_ports { xx }]; #EXP1x10_J271_P19
+# set_property -dict { PACKAGE_PIN AG33 IOSTANDARD LVCMOS18 } [get_ports { xx }]; #EXP1x10_J271_P19
-###2## IO_TRIGGER, IO_CLKOUT and USB signals moved to FMC_HA pins for now. Skipping FMC_HA00_CC, FMC_HA01_CC as they are clocks
+###Unused Signals
set_property -dict { PACKAGE_PIN BD13 IOSTANDARD LVCMOS18 } [get_ports { IO_TRIGGER }]; #FMC_HA02_P
set_property -dict { PACKAGE_PIN BE13 IOSTANDARD LVCMOS18 } [get_ports { IO_CLKOUT }]; #FMC_HA02_N
set_property -dict { PACKAGE_PIN BD12 IOSTANDARD LVCMOS18 } [get_ports { USB_P }]; #FMC_HA03_P
@@ -170,6 +170,12 @@
set_property -dict { PACKAGE_PIN BB12 IOSTANDARD LVCMOS18 } [get_ports { IO_USB_DNPULLUP0 }]; #FMC_HA04_N
set_property -dict { PACKAGE_PIN BC11 IOSTANDARD LVCMOS18 } [get_ports { IO_USB_DPPULLUP0 }]; #FMC_HA05_P
set_property -dict { PACKAGE_PIN BD11 IOSTANDARD LVCMOS18 } [get_ports { IOB9 }]; #FMC_HA05_N
+#MISC from PMOD3
+set_property -dict { PACKAGE_PIN BE15 IOSTANDARD LVCMOS18 } [get_ports { IOA0 }]; #FMC_HA06_P
+set_property -dict { PACKAGE_PIN BF15 IOSTANDARD LVCMOS18 } [get_ports { IOC6 }]; #FMC_HA06_N
+set_property -dict { PACKAGE_PIN BE14 IOSTANDARD LVCMOS18 } [get_ports { IOC7 }]; #FMC_HA07_P
+set_property -dict { PACKAGE_PIN BF14 IOSTANDARD LVCMOS18 } [get_ports { IOA1 }]; #FMC_HA07_N
+set_property -dict { PACKAGE_PIN BC15 IOSTANDARD LVCMOS18 } [get_ports { IOC9 }]; #FMC_HA08_P
## TI TUSB1T1105AMHX USB Transceiver "usbdev" testing, Bank 64 LVCMOS18
diff --git a/hw/top_matcha/dv/chip_sim_cfg.hjson b/hw/top_matcha/dv/chip_sim_cfg.hjson
index ac9d937..6e90b3a 100644
--- a/hw/top_matcha/dv/chip_sim_cfg.hjson
+++ b/hw/top_matcha/dv/chip_sim_cfg.hjson
@@ -456,7 +456,7 @@
uvm_test_seq: chip_sw_base_vseq
sw_images: [
"//sw/device/tests/smc:smc_kelvin_hello_test:6:matcha",
- "//sw/device/tests/kelvin/testdata:kelvin_hello_world:7:matcha"]
+ "//sw/device/tests/kelvin:kelvin_hello_world:7:matcha"]
en_run_modes: ["sw_test_mode_test_simple_sec"]
run_opts:["+sw_test_timeout_ns=40_000_000"]
}
@@ -575,7 +575,9 @@
{
name: chip_sw_smc_kelvin_checksum_test
uvm_test_seq: chip_sw_base_vseq
- sw_images: ["//sw/device/tests/smc:smc_kelvin_checksum_test:6:matcha"]
+ sw_images: [
+ "//sw/device/tests/smc:smc_kelvin_checksum_test:6:matcha",
+ "//sw/device/tests/kelvin:kelvin_checksum:7:matcha"]
en_run_modes: ["sw_test_mode_test_simple_sec"]
run_opts:["+sw_test_timeout_ns=40_000_000"]
}
@@ -2131,6 +2133,7 @@
"chip_sw_smc_isp_wrapper_irq_test",
"chip_sw_smc_isp_wrapper_test",
"chip_sw_smc_isp_wrapper_tpg_64_64_test",
+ "chip_sw_smc_kelvin_checksum_test",
"chip_sw_smc_kelvin_hello_test",
"chip_sw_smc_lsu_interrupt_boundary_test",
"chip_sw_smc_lsu_page_boundary_test",
diff --git a/rules/matcha.bzl b/rules/matcha.bzl
index b3026bc..c83860c 100644
--- a/rules/matcha.bzl
+++ b/rules/matcha.bzl
@@ -635,18 +635,25 @@
srcs: The c source files.
**kwargs: Additional arguments forward to cc_binary.
Emits rules:
+ bin_to_vmem named: <name>_vmem
+ Generating the 256-bitwidth vmem output for the target.
+ 256_bitwidth_vmem named: <name>.256.vmem
+ Containing the 256-bitwidth vmem output.
filegroup named: <name>.bin
Containing the binary output for the target.
filegroup named: <name>.elf
Containing all elf output for the target.
+ filegroup named: <name>
+ Containing cc outputs and 256-bitwidth vmem target.
"""
srcs = srcs + [
"//sw/device/lib/testing/test_framework:kelvin_gloss.c",
"//sw/device/lib/testing/test_framework:kelvin_start.S",
"@lowrisc_opentitan//sw/device/lib/crt:crt.S",
]
+ kelvin_cc_name = "{}_cc".format(name)
kelvin_binary_impl(
- name = name,
+ name = kelvin_cc_name,
srcs = srcs,
linker_script = "//sw/device/lib/testing/test_framework:kelvin.ld",
linker_script_includes = [
@@ -656,13 +663,49 @@
)
# Need to create the following filegroups to make the output discoverable.
+ bin_name = "{}.bin".format(name)
native.filegroup(
- name = "{}.bin".format(name),
- srcs = [name],
+ name = bin_name,
+ srcs = [kelvin_cc_name],
output_group = "bin_file",
)
+ elf_name = "{}.elf".format(name)
native.filegroup(
- name = "{}.elf".format(name),
- srcs = [name],
+ name = elf_name,
+ srcs = [kelvin_cc_name],
output_group = "elf_file",
)
+
+ # Generate vmem file for dv testbench
+ # Memory in ml_top has word size 256. srec_cat supports only up to 128.
+ # Build a flow to transform 32-bitwidth format into 256-bitwidth format.
+ vmem_32_name = "{}.32.vmem".format(name)
+ vmem_256_name = "{}.256.vmem".format(name)
+ bin_to_vmem(
+ name = vmem_32_name,
+ bin = bin_name,
+ word_size = 32,
+ )
+
+ cmd = """
+ $(location //util:gen_vmem_256) \
+ --input=$< \
+ --output=$@
+ """
+ vmem_name = "{}_vmem".format(name)
+ native.genrule(
+ name = vmem_name,
+ srcs = [vmem_32_name],
+ outs = [vmem_256_name],
+ cmd = cmd,
+ tools = ["@matcha//util:gen_vmem_256"],
+ **kwargs
+ )
+ native.filegroup(
+ name = name,
+ srcs = [
+ bin_name,
+ elf_name,
+ vmem_name,
+ ],
+ )
diff --git a/sw/device/tests/kelvin/testdata/BUILD b/sw/device/tests/kelvin/testdata/BUILD
deleted file mode 100644
index 9b00741..0000000
--- a/sw/device/tests/kelvin/testdata/BUILD
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2023 Google contributors.
-
-package(default_visibility = ["//visibility:public"])
-
-filegroup(
- name = "kelvin_hello_world",
- srcs = ["kelvin_hello_world.256.vmem"],
-)
diff --git a/sw/device/tests/kelvin/testdata/kelvin_hello_world.256.vmem b/sw/device/tests/kelvin/testdata/kelvin_hello_world.256.vmem
deleted file mode 100755
index ec7f4b2..0000000
--- a/sw/device/tests/kelvin/testdata/kelvin_hello_world.256.vmem
+++ /dev/null
@@ -1,12 +0,0 @@
-/* http://srecord.sourceforge.net/ */
-@00000000 0000041300000393000003130000021394C18193000011970001011310020117
-@00000001 0000089300000813000007930000071300000693000006130000059300000493
-@00000002 00000C9300000C1300000B9300000B1300000A9300000A130000099300000913
-@00000003 200005932000051300000F9300000F1300000E9300000E1300000D9300000D13
-@00000004 FE946AE300440413000280E70004228300947A631540049315400413064000EF
-@00000005 001007B70000006F08000073000080E701408093000000970000059300000513
-@00000006 0000051326000077FED798E3FEE7AE2300170713004787930007A703001016B7
-@00000007 FEB56CE3004505130005202300029E630032F29300B562B302B5706300008067
-@00000008 0032F29300C2E2B300B562B302B57C63C00010730000806700B5146300008067
-@00000009 004505130055202300460613000622830262E26340A5833340C502B302029863
-@0000000A FFFFFFFFC00010730000806700B51463 00008067FEB568E3
diff --git a/sw/device/tests/smc/smc_kelvin_checksum_test.c b/sw/device/tests/smc/smc_kelvin_checksum_test.c
index 5b70a23..9c038a0 100644
--- a/sw/device/tests/smc/smc_kelvin_checksum_test.c
+++ b/sw/device/tests/smc/smc_kelvin_checksum_test.c
@@ -67,7 +67,7 @@
while (intr_state == 0x0) {
intr_state = mmio_region_read32(base_addr, ML_TOP_INTR_STATE_REG_OFFSET);
- busy_spin_micros(10 * 1000);
+ busy_spin_micros(200);
}
// Received interrupts from Kelvin core, check if only FINISH asserted
diff --git a/util/BUILD b/util/BUILD
index b83b8e6..4016ec9 100644
--- a/util/BUILD
+++ b/util/BUILD
@@ -79,6 +79,13 @@
],
)
+py_binary(
+ name = "gen_vmem_256",
+ srcs = [
+ "gen_vmem_256.py",
+ ],
+)
+
filegroup(
name = "topgen_tpl_files",
srcs = glob(["topgen/**/*.tpl"]) + [
diff --git a/util/gen_vmem_256.py b/util/gen_vmem_256.py
new file mode 100644
index 0000000..d85ad5d
--- /dev/null
+++ b/util/gen_vmem_256.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+# Copyright 2023 Google LLC
+#
+# 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.
+"""
+Generate 256-bitwidth vmem file from 32-bitwidth vmem file
+"""
+
+import argparse
+import re
+
+def main():
+ """
+ Args:
+ input: The input 32-bitwidth vmem file name.
+ output: The output 256-bitwidth vmem file name.
+ """
+ parser = argparse.ArgumentParser(description='Generate 256-bitwidth vmem file.')
+ parser.add_argument("--input",
+ "-i",
+ action='store',
+ required=True,
+ help="Input 32-bitwidth vmem file")
+ parser.add_argument("--output",
+ "-o",
+ required=True,
+ help="Output 256-bitwidth vmem file")
+ parser.add_argument("--entry_addr",
+ default = 0x0,
+ help="Entry address of kelvin program")
+ args = parser.parse_args()
+
+ # Open input/output files
+ infile = open(args.input, 'r')
+ outfile = open(args.output, 'w')
+
+ # Fetch each line from 32-bitwidth vmem file and dump each data line for
+ # 256-bitwidth vmem file.
+ addr_base = args.entry_addr
+ mem_data_line = ""
+ word_per_line = 8
+ for line in infile.readlines():
+ # Ignore comment
+ if re.match(r"\/\*(.)*\*\/", line):
+ continue
+ tokens = line.split()
+ m = re.match(r"@([0-9a-fA-F]{8})", tokens[0])
+ addr = int(m[1], 16)
+ for token in tokens[1:]:
+ mem_data_line = token + mem_data_line
+ addr = addr + 1
+ # Write out a mem data line when it is ready
+ if (addr % word_per_line) == 0:
+ outfile.write(f"@{addr_base:08X} {mem_data_line}\n")
+ addr_base = int((addr + args.entry_addr) / word_per_line)
+ mem_data_line = ""
+ if mem_data_line:
+ outfile.write(f"@{addr_base:08X} {mem_data_line}\n")
+ infile.close()
+ outfile.close()
+
+if __name__ == "__main__":
+ main()