mirror of https://github.com/efabless/caravel.git
371 lines
11 KiB
Systemverilog
371 lines
11 KiB
Systemverilog
`timescale 1 ns / 1 ps
|
|
`ifdef VCS
|
|
`ifndef ENABLE_SDF
|
|
`include "libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
|
|
`include "libs.ref/sky130_fd_io/verilog/sky130_ef_io.v"
|
|
`include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
|
|
`include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
|
|
`include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
|
|
`include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
|
|
`else
|
|
`include "cvc-pdk/sky130_ef_io.v"
|
|
`include "cvc-pdk/sky130_fd_io.v"
|
|
`include "cvc-pdk/primitives_hd.v"
|
|
`include "cvc-pdk/sky130_fd_sc_hd.v"
|
|
`include "cvc-pdk/primitives_hvl.v"
|
|
`include "cvc-pdk/sky130_fd_sc_hvl.v"
|
|
`endif // ENABLE_SDF
|
|
`endif // VCS
|
|
|
|
module caravel_top ;
|
|
|
|
// parameter FILENAME = {"hex_files/",`TESTNAME,".hex"};
|
|
parameter FILENAME={"hex_files/",`TESTNAME,".hex"};
|
|
initial begin
|
|
`ifdef VCS
|
|
`ifdef ENABLE_SDF
|
|
$vcdplusfile({`MAIN_PATH,"/sim/",`TAG,"/",`FTESTNAME,"/",`TESTNAME , `CORNER,"-",`SDF_POSTFIX, ".vpd"});
|
|
`else
|
|
$vcdplusfile({`MAIN_PATH,"/sim/",`TAG,"/",`FTESTNAME,"/",`TESTNAME ,".vpd"});
|
|
`endif
|
|
$vcdpluson();
|
|
`else
|
|
$dumpfile ({"sim/",`TAG,"/",`SIM,"-",`TESTNAME,"/",`SIM,"-",`TESTNAME,".vcd"});
|
|
$dumpvars (0, caravel_top);
|
|
`endif
|
|
end
|
|
`ifdef VCS
|
|
`ifdef ENABLE_SDF
|
|
`include "sdf_includes.v"
|
|
`endif
|
|
`endif // VCS
|
|
wire vddio_tb; // Common 3.3V padframe/ESD power
|
|
wire vddio_2_tb; // Common 3.3V padframe/ESD power
|
|
wire vssio_tb; // Common padframe/ESD ground
|
|
wire vssio_2_tb; // Common padframe/ESD ground
|
|
wire vdda_tb; // Management 3.3V power
|
|
wire vssa_tb; // Common analog ground
|
|
wire vccd_tb; // Management/Common 1.8V power
|
|
wire vssd_tb; // Common digital ground
|
|
wire vdda1_tb; // User area 1 3.3V power
|
|
wire vdda1_2_tb; // User area 1 3.3V power
|
|
wire vdda2_tb; // User area 2 3.3V power
|
|
wire vssa1_tb; // User area 1 analog ground
|
|
wire vssa1_2_tb; // User area 1 analog ground
|
|
wire vssa2_tb; // User area 2 analog ground
|
|
wire vccd1_tb; // User area 1 1.8V power
|
|
wire vccd2_tb; // User area 2 1.8V power
|
|
wire vssd1_tb; // User area 1 digital ground
|
|
wire vssd2_tb; // User area 2 digital ground
|
|
|
|
wire gpio_tb; // Used for external LDO control
|
|
wire [38-1:0] mprj_io_tb;
|
|
reg clock_tb; // CMOS core clock input; not a crystal
|
|
wire resetb_tb; // Reset input (sense inverted)
|
|
|
|
// Note that only two flash data pins are dedicated to the
|
|
// management SoC wrapper. The management SoC exports the
|
|
// quad SPI mode status to make use of the top two mprj_io
|
|
// pins for io2 and io3.
|
|
|
|
wire flash_csb_tb;
|
|
wire flash_clk_tb;
|
|
wire flash_io0_tb;
|
|
wire flash_io1_tb;
|
|
|
|
|
|
|
|
caravel uut (
|
|
.vddio (vddio_tb),
|
|
.vddio_2 (vddio_2_tb),
|
|
.vssio (vssio_tb),
|
|
.vssio_2 (vssio_2_tb),
|
|
.vdda (vdda_tb),
|
|
.vssa (vssa_tb),
|
|
.vccd (vccd_tb),
|
|
.vssd (vssd_tb),
|
|
.vdda1 (vdda1_tb),
|
|
.vdda1_2 (vdda1_2_tb),
|
|
.vdda2 (vdda2_tb),
|
|
.vssa1 (vssa1_tb),
|
|
.vssa1_2 (vssa1_2_tb),
|
|
.vssa2 (vssa2_tb),
|
|
.vccd1 (vccd1_tb),
|
|
.vccd2 (vccd2_tb),
|
|
.vssd1 (vssd1_tb),
|
|
.vssd2 (vssd2_tb),
|
|
.clock (clock_tb),
|
|
.gpio (gpio_tb),
|
|
.mprj_io (mprj_io_tb),
|
|
.flash_csb(flash_csb_tb),
|
|
.flash_clk(flash_clk_tb),
|
|
.flash_io0(flash_io0_tb),
|
|
.flash_io1(flash_io1_tb),
|
|
.resetb (resetb_tb)
|
|
);
|
|
|
|
spiflash #(
|
|
FILENAME
|
|
) spiflash (
|
|
.csb(flash_csb_tb),
|
|
.clk(flash_clk_tb),
|
|
.io0(flash_io0_tb),
|
|
.io1(flash_io1_tb),
|
|
.io2(), // not used
|
|
.io3() // not used
|
|
);
|
|
|
|
mac macros();
|
|
|
|
|
|
// make speical variables for the mprj input to assign the input without writing to the output gpios
|
|
// cocotb limitation #2587: iverilog deal with array as 1 object not multiple of objects so can't write to only 1 element
|
|
wire bin0;
|
|
wire bin0_en;
|
|
wire bin1;
|
|
wire bin1_en;
|
|
wire bin2;
|
|
wire bin2_en;
|
|
wire bin3;
|
|
wire bin3_en;
|
|
wire bin4;
|
|
wire bin4_en;
|
|
wire bin5;
|
|
wire bin5_en;
|
|
wire bin6;
|
|
wire bin6_en;
|
|
wire bin7;
|
|
wire bin7_en;
|
|
wire bin8;
|
|
wire bin8_en;
|
|
wire bin9;
|
|
wire bin9_en;
|
|
wire bin10;
|
|
wire bin10_en;
|
|
wire bin11;
|
|
wire bin11_en;
|
|
wire bin12;
|
|
wire bin12_en;
|
|
wire bin13;
|
|
wire bin13_en;
|
|
wire bin14;
|
|
wire bin14_en;
|
|
wire bin15;
|
|
wire bin15_en;
|
|
wire bin16;
|
|
wire bin16_en;
|
|
wire bin17;
|
|
wire bin17_en;
|
|
wire bin18;
|
|
wire bin18_en;
|
|
wire bin19;
|
|
wire bin19_en;
|
|
wire bin20;
|
|
wire bin20_en;
|
|
wire bin21;
|
|
wire bin21_en;
|
|
wire bin22;
|
|
wire bin22_en;
|
|
wire bin23;
|
|
wire bin23_en;
|
|
wire bin24;
|
|
wire bin24_en;
|
|
wire bin25;
|
|
wire bin25_en;
|
|
wire bin26;
|
|
wire bin26_en;
|
|
wire bin27;
|
|
wire bin27_en;
|
|
wire bin28;
|
|
wire bin28_en;
|
|
wire bin29;
|
|
wire bin29_en;
|
|
wire bin30;
|
|
wire bin30_en;
|
|
wire bin31;
|
|
wire bin31_en;
|
|
wire bin32;
|
|
wire bin32_en;
|
|
wire bin33;
|
|
wire bin33_en;
|
|
wire bin34;
|
|
wire bin34_en;
|
|
wire bin35;
|
|
wire bin35_en;
|
|
wire bin36;
|
|
wire bin36_en;
|
|
wire bin37;
|
|
wire bin37_en;
|
|
|
|
|
|
assign mprj_io_tb[0] = (bin0_en) ? bin0 : 1'bz;
|
|
assign mprj_io_tb[1] = (bin1_en) ? bin1 : 1'bz;
|
|
assign mprj_io_tb[2] = (bin2_en) ? bin2 : 1'bz;
|
|
assign mprj_io_tb[3] = (bin3_en) ? bin3 : 1'bz;
|
|
assign mprj_io_tb[4] = (bin4_en) ? bin4 : 1'bz;
|
|
|
|
assign mprj_io_tb[5] = (bin5_en) ? bin5 : 1'bz;
|
|
assign mprj_io_tb[6] = (bin6_en) ? bin6 : 1'bz;
|
|
assign mprj_io_tb[7] = (bin7_en) ? bin7 : 1'bz;
|
|
assign mprj_io_tb[8] = (bin8_en) ? bin8 : 1'bz;
|
|
assign mprj_io_tb[9] = (bin9_en) ? bin9 : 1'bz;
|
|
|
|
assign mprj_io_tb[10] = (bin10_en) ? bin10 : 1'bz;
|
|
assign mprj_io_tb[11] = (bin11_en) ? bin11 : 1'bz;
|
|
assign mprj_io_tb[12] = (bin12_en) ? bin12 : 1'bz;
|
|
assign mprj_io_tb[13] = (bin13_en) ? bin13 : 1'bz;
|
|
assign mprj_io_tb[14] = (bin14_en) ? bin14 : 1'bz;
|
|
|
|
assign mprj_io_tb[15] = (bin15_en) ? bin15 : 1'bz;
|
|
assign mprj_io_tb[16] = (bin16_en) ? bin16 : 1'bz;
|
|
assign mprj_io_tb[17] = (bin17_en) ? bin17 : 1'bz;
|
|
assign mprj_io_tb[18] = (bin18_en) ? bin18 : 1'bz;
|
|
assign mprj_io_tb[19] = (bin19_en) ? bin19 : 1'bz;
|
|
|
|
assign mprj_io_tb[20] = (bin20_en) ? bin20 : 1'bz;
|
|
assign mprj_io_tb[21] = (bin21_en) ? bin21 : 1'bz;
|
|
assign mprj_io_tb[22] = (bin22_en) ? bin22 : 1'bz;
|
|
assign mprj_io_tb[23] = (bin23_en) ? bin23 : 1'bz;
|
|
assign mprj_io_tb[24] = (bin24_en) ? bin24 : 1'bz;
|
|
|
|
assign mprj_io_tb[25] = (bin25_en) ? bin25 : 1'bz;
|
|
assign mprj_io_tb[26] = (bin26_en) ? bin26 : 1'bz;
|
|
assign mprj_io_tb[27] = (bin27_en) ? bin27 : 1'bz;
|
|
assign mprj_io_tb[28] = (bin28_en) ? bin28 : 1'bz;
|
|
assign mprj_io_tb[29] = (bin29_en) ? bin29 : 1'bz;
|
|
|
|
assign mprj_io_tb[30] = (bin30_en) ? bin30 : 1'bz;
|
|
assign mprj_io_tb[31] = (bin31_en) ? bin31 : 1'bz;
|
|
assign mprj_io_tb[32] = (bin32_en) ? bin32 : 1'bz;
|
|
assign mprj_io_tb[33] = (bin33_en) ? bin33 : 1'bz;
|
|
assign mprj_io_tb[34] = (bin34_en) ? bin34 : 1'bz;
|
|
|
|
assign mprj_io_tb[35] = (bin35_en) ? bin35 : 1'bz;
|
|
assign mprj_io_tb[36] = (bin36_en) ? bin36 : 1'bz;
|
|
assign mprj_io_tb[37] = (bin37_en) ? bin37 : 1'bz;
|
|
|
|
|
|
|
|
// to read from mprj array with iverilog
|
|
wire bin0_monitor;
|
|
wire bin1_monitor;
|
|
wire bin2_monitor;
|
|
wire bin3_monitor;
|
|
wire bin4_monitor;
|
|
wire bin5_monitor;
|
|
wire bin6_monitor;
|
|
wire bin7_monitor;
|
|
wire bin8_monitor;
|
|
wire bin9_monitor;
|
|
wire bin10_monitor;
|
|
wire bin11_monitor;
|
|
wire bin12_monitor;
|
|
wire bin13_monitor;
|
|
wire bin14_monitor;
|
|
wire bin15_monitor;
|
|
wire bin16_monitor;
|
|
wire bin17_monitor;
|
|
wire bin18_monitor;
|
|
wire bin19_monitor;
|
|
wire bin20_monitor;
|
|
wire bin21_monitor;
|
|
wire bin22_monitor;
|
|
wire bin23_monitor;
|
|
wire bin24_monitor;
|
|
wire bin25_monitor;
|
|
wire bin26_monitor;
|
|
wire bin27_monitor;
|
|
wire bin28_monitor;
|
|
wire bin29_monitor;
|
|
wire bin30_monitor;
|
|
wire bin31_monitor;
|
|
wire bin32_monitor;
|
|
wire bin33_monitor;
|
|
wire bin34_monitor;
|
|
wire bin35_monitor;
|
|
wire bin36_monitor;
|
|
wire bin37_monitor;
|
|
|
|
assign bin0_monitor = mprj_io_tb[0];
|
|
assign bin1_monitor = mprj_io_tb[1];
|
|
assign bin2_monitor = mprj_io_tb[2];
|
|
assign bin3_monitor = mprj_io_tb[3];
|
|
assign bin4_monitor = mprj_io_tb[4];
|
|
assign bin5_monitor = mprj_io_tb[5];
|
|
assign bin6_monitor = mprj_io_tb[6];
|
|
assign bin7_monitor = mprj_io_tb[7];
|
|
assign bin8_monitor = mprj_io_tb[8];
|
|
assign bin9_monitor = mprj_io_tb[9];
|
|
assign bin10_monitor = mprj_io_tb[10];
|
|
assign bin11_monitor = mprj_io_tb[11];
|
|
assign bin12_monitor = mprj_io_tb[12];
|
|
assign bin13_monitor = mprj_io_tb[13];
|
|
assign bin14_monitor = mprj_io_tb[14];
|
|
assign bin15_monitor = mprj_io_tb[15];
|
|
assign bin16_monitor = mprj_io_tb[16];
|
|
assign bin17_monitor = mprj_io_tb[17];
|
|
assign bin18_monitor = mprj_io_tb[18];
|
|
assign bin19_monitor = mprj_io_tb[19];
|
|
assign bin20_monitor = mprj_io_tb[20];
|
|
assign bin21_monitor = mprj_io_tb[21];
|
|
assign bin22_monitor = mprj_io_tb[22];
|
|
assign bin23_monitor = mprj_io_tb[23];
|
|
assign bin24_monitor = mprj_io_tb[24];
|
|
assign bin25_monitor = mprj_io_tb[25];
|
|
assign bin26_monitor = mprj_io_tb[26];
|
|
assign bin27_monitor = mprj_io_tb[27];
|
|
assign bin28_monitor = mprj_io_tb[28];
|
|
assign bin29_monitor = mprj_io_tb[29];
|
|
assign bin30_monitor = mprj_io_tb[30];
|
|
assign bin31_monitor = mprj_io_tb[31];
|
|
assign bin32_monitor = mprj_io_tb[32];
|
|
assign bin33_monitor = mprj_io_tb[33];
|
|
assign bin34_monitor = mprj_io_tb[34];
|
|
assign bin35_monitor = mprj_io_tb[35];
|
|
assign bin36_monitor = mprj_io_tb[36];
|
|
assign bin37_monitor = mprj_io_tb[37];
|
|
|
|
endmodule
|
|
|
|
// module that has all needed macros by cocotb
|
|
module mac;
|
|
|
|
reg [7:0] MPRJ_IO_PADS_1 = `ifdef MPRJ_IO_PADS_1 `MPRJ_IO_PADS_1 `else 0 `endif; /* number of user GPIO pads on user1 side */
|
|
reg [7:0] MPRJ_IO_PADS_2 = `ifdef MPRJ_IO_PADS_2 `MPRJ_IO_PADS_2 `else 0 `endif; /* number of user GPIO pads on user2 side */
|
|
reg [7:0] MPRJ_IO_PADS = `ifdef MPRJ_IO_PADS `MPRJ_IO_PADS `else 0 `endif;
|
|
reg [7:0] MPRJ_PWR_PADS_1 =`ifdef MPRJ_PWR_PADS_1 `MPRJ_PWR_PADS_1 `else 0 `endif; /* vdda1, vccd1 enable/disable control */
|
|
reg [7:0] MPRJ_PWR_PADS_2 = `ifdef MPRJ_PWR_PADS_2 `MPRJ_PWR_PADS_2 `else 0 `endif; /* vdda2, vccd2 enable/disable control */
|
|
reg [7:0] MPRJ_PWR_PADS =`ifdef MPRJ_PWR_PADS `MPRJ_PWR_PADS `else 0 `endif;
|
|
// Analog pads are only used by the "caravan" module and associated
|
|
// modules such as user_analog_project_wrapper and chip_io_alt.
|
|
reg [7:0] ANALOG_PADS_1 = `ifdef ANALOG_PADS_1 `ANALOG_PADS_1 `else 0 `endif;
|
|
reg [7:0] ANALOG_PADS_2 = `ifdef ANALOG_PADS_2 `ANALOG_PADS_2 `else 0 `endif;
|
|
reg [7:0] ANALOG_PADS = `ifdef ANALOG_PADS `ANALOG_PADS `else 0 `endif;
|
|
|
|
// Type and size of soc_mem
|
|
reg USE_CUSTOM_DFFRAM = `ifdef USE_CUSTOM_DFFRAM 1 `else 0 `endif;
|
|
// don't change the following without double checking addr widths
|
|
reg [7:0] MEM_WORDS = `ifdef MEM_WORDS `MEM_WORDS `else 0 `endif;
|
|
// Number of columns in the custom memory; takes one of three values:
|
|
// 1 column : 1 KB, 2 column: 2 KB, 4 column: 4KB
|
|
reg [7:0] DFFRAM_WSIZE = `ifdef DFFRAM_WSIZE `DFFRAM_WSIZE `else 0 `endif;
|
|
reg [7:0] DFFRAM_USE_LATCH = `ifdef DFFRAM_USE_LATCH `DFFRAM_USE_LATCH `else 0 `endif;
|
|
|
|
// not really parameterized but just to easily keep track of the number
|
|
// of ram_block across different modules
|
|
reg [7:0] RAM_BLOCKS = `ifdef RAM_BLOCKS `RAM_BLOCKS `else 0 `endif;
|
|
|
|
// Clock divisor default value
|
|
reg [7:0] CLK_DIV = `ifdef CLK_DIV `CLK_DIV `else 0 `endif;
|
|
|
|
// GPIO control default mode and enable for most I/Os
|
|
// Most I/Os set to be user bidirectional pins on power-up.
|
|
reg [7:0] MGMT_INIT = `ifdef MGMT_INIT `MGMT_INIT `else 0 `endif;
|
|
reg [7:0] OENB_INIT = `ifdef OENB_INIT `OENB_INIT `else 0 `endif;
|
|
reg [7:0] DM_INIT = `ifdef DM_INIT `DM_INIT `else 0 `endif;
|
|
|
|
// GL
|
|
|
|
reg GL = `ifdef GL 1 `else 0 `endif;
|
|
|
|
endmodule |