Build system: Added the ability to simulate an FPGA SoC and fixed all the warning verilator gave of the code previously used only for synthesis.
This commit is contained in:
parent
48249e8051
commit
533f346f9b
1
.gitignore
vendored
1
.gitignore
vendored
@ -20,3 +20,4 @@ system/simplified_ucode.txt
|
|||||||
system/build/
|
system/build/
|
||||||
tools/*svg
|
tools/*svg
|
||||||
system/external_ip/litedram_core_ecp5_phy.v
|
system/external_ip/litedram_core_ecp5_phy.v
|
||||||
|
system/external_ip/litedram_core_ecp5_phy_sim.v
|
||||||
|
3
Makefile
3
Makefile
@ -51,3 +51,6 @@ clean:
|
|||||||
|
|
||||||
upload: boot_code/bios.stxt
|
upload: boot_code/bios.stxt
|
||||||
${Q}make ${MAKEOPTS} PRINT_PATH_PREFIX=system/ -C system upload
|
${Q}make ${MAKEOPTS} PRINT_PATH_PREFIX=system/ -C system upload
|
||||||
|
|
||||||
|
fpga_sim: boot_code/bios.stxt
|
||||||
|
${Q}make ${MAKEOPTS} PRINT_PATH_PREFIX=system/ -C system fpga_sim
|
||||||
|
110
system/Makefile
110
system/Makefile
@ -20,52 +20,14 @@ INCLUDES=exec_state_def.v alu_header.v config.v ucode_header.v error_header.v
|
|||||||
MICROCODE=ucode.txt
|
MICROCODE=ucode.txt
|
||||||
SYSTEM_VVP=system.vvp
|
SYSTEM_VVP=system.vvp
|
||||||
PRINT_PATH_PREFIX=./
|
PRINT_PATH_PREFIX=./
|
||||||
|
BUILD_FILES_PREFIX=build/
|
||||||
|
|
||||||
BOOT_CODE=boot_code.txt
|
BOOT_CODE=boot_code.txt
|
||||||
VERILATOR_BIN=obj_dir/Vsystem
|
VERILATOR_BIN=obj_dir/Vsystem
|
||||||
|
VERILATOR_FPGA_BIN=/Vfpga_top
|
||||||
NO_ASM=0
|
NO_ASM=0
|
||||||
include ../common.mk
|
include ../common.mk
|
||||||
|
|
||||||
################################################################################
|
|
||||||
#### SIMULATION RECIPES ####
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
EVENT_SIM_TESTBENCH=testbench.v
|
|
||||||
VERILATOR_TESTBENCH=testbench.cpp
|
|
||||||
SIMULATION_TOP_LEVEL_SOURCE=system.v
|
|
||||||
GTKWSAVE=../gtkwave_savefile.gtkw
|
|
||||||
|
|
||||||
#build options
|
|
||||||
VERILATOR_OPTS += --cc --exe
|
|
||||||
|
|
||||||
#binary options
|
|
||||||
VERILATOR_OPTS += --trace-fst --threads 1 --autoflush
|
|
||||||
|
|
||||||
#linter options
|
|
||||||
VERILATOR_OPTS += -Wall --Wno-DECLFILENAME
|
|
||||||
|
|
||||||
#optimisation options
|
|
||||||
VERILATOR_OPTS += -x-assign fast --x-initial fast
|
|
||||||
#For testing use:
|
|
||||||
#VERILATOR_OPTS += -x-assign unique --x-initial unique
|
|
||||||
|
|
||||||
# COMPILING
|
|
||||||
${SYSTEM_VVP} : ${SIMULATION_TOP_LEVEL_SOURCE} ${SOURCES} ${INCLUDES} ${EVENT_SIM_TESTBENCH}
|
|
||||||
${QUIET_IVERILOG}
|
|
||||||
${Q}iverilog -g2012 -D CALCULATE_IPC -D OUTPUT_JSON_STATISTICS -o "$@" ${SIMULATION_TOP_LEVEL_SOURCE} ${SOURCES} ${EVENT_SIM_TESTBENCH}
|
|
||||||
|
|
||||||
${VERILATOR_BIN}: ${VERILATOR_BIN}.mk
|
|
||||||
${Q}make ${MAKEOPTS} PRINT_PATH_PREFIX=${PRINT_PATH_PREFIX}obj_dir/ OPT_FAST="-O2 -march=native -mtune=native" -C obj_dir -f ../verilator_makefile Vsystem
|
|
||||||
|
|
||||||
${VERILATOR_BIN}.mk: ${VERILATOR_TESTBENCH} ${SIMULATION_TOP_LEVEL_SOURCE} ${SOURCES} ${INCLUDES}
|
|
||||||
${QUIET_VERILATOR}
|
|
||||||
${Q}verilator -DCALCULATE_IPC -DOUTPUT_JSON_STATISTICS ${VERILATOR_OPTS} $^
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
#### FPGA/ASIC RECIPES ####
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
BUILD_FILES_PREFIX=build/
|
|
||||||
$(shell mkdir -p $(BUILD_FILES_PREFIX))
|
$(shell mkdir -p $(BUILD_FILES_PREFIX))
|
||||||
FPGA_SEED ::= $(shell seq 1 200|sort -R|head -n1)
|
FPGA_SEED ::= $(shell seq 1 200|sort -R|head -n1)
|
||||||
|
|
||||||
@ -86,6 +48,64 @@ else
|
|||||||
$(error invalid ECP5 device ${ECP5_DEVICE})
|
$(error invalid ECP5 device ${ECP5_DEVICE})
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
EVENT_SIM_TESTBENCH=testbench.v
|
||||||
|
VERILATOR_TESTBENCH=testbench.cpp
|
||||||
|
SIMULATION_TOP_LEVEL_SOURCE=system.v
|
||||||
|
GTKWSAVE=../gtkwave_savefile.gtkw
|
||||||
|
|
||||||
|
SIMULATED_SOURCES ::= ${SIMULATION_TOP_LEVEL_SOURCE} ${SOURCES} ${INCLUDES}
|
||||||
|
FPGA_SIM_SOURCES ::= fpga_config/${FPGA_BOARD}/fpga_top.v ${SOURCES} ${FPGA_SOC_SIM_SOURCES} ${INCLUDES}
|
||||||
|
FPGA_SOURCES ::= fpga_config/${FPGA_BOARD}/fpga_top.v ${SOURCES} ${FPGA_SOC_SOURCES} ${INCLUDES}
|
||||||
|
|
||||||
|
#build options
|
||||||
|
VERILATOR_OPTS += --cc --exe
|
||||||
|
|
||||||
|
#binary options
|
||||||
|
VERILATOR_OPTS += --trace-fst --threads 1 --autoflush
|
||||||
|
|
||||||
|
#linter options
|
||||||
|
VERILATOR_OPTS += -Wall --Wno-DECLFILENAME
|
||||||
|
|
||||||
|
#optimisation options
|
||||||
|
VERILATOR_OPTS += -x-assign fast --x-initial fast
|
||||||
|
#For testing use:
|
||||||
|
#VERILATOR_OPTS += -x-assign unique --x-initial unique
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
#### SIMULATION RECIPES ####
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# COMPILING
|
||||||
|
${SYSTEM_VVP} : ${SIMULATED_SOURCES} ${EVENT_SIM_TESTBENCH}
|
||||||
|
${QUIET_IVERILOG}
|
||||||
|
${Q}iverilog -g2012 -D CALCULATE_IPC -D OUTPUT_JSON_STATISTICS -o "$@" ${SIMULATION_TOP_LEVEL_SOURCE} ${SOURCES} ${EVENT_SIM_TESTBENCH}
|
||||||
|
|
||||||
|
${VERILATOR_BIN}: ${VERILATOR_BIN}.mk
|
||||||
|
${Q}make ${MAKEOPTS} PRINT_PATH_PREFIX=${PRINT_PATH_PREFIX}obj_dir/ OPT_FAST="-O2 -march=native -mtune=native" -C obj_dir -f ../verilator_makefile Vsystem
|
||||||
|
|
||||||
|
${VERILATOR_BIN}.mk: ${VERILATOR_TESTBENCH} ${SIMULATED_SOURCES}
|
||||||
|
${QUIET_VERILATOR}
|
||||||
|
mkdir -p ${BUILD_FILES_PREFIX}/sim_${FPGA_BOARD}/
|
||||||
|
${Q}verilator -DCALCULATE_IPC -DOUTPUT_JSON_STATISTICS ${VERILATOR_OPTS} $^
|
||||||
|
|
||||||
|
${BUILD_FILES_PREFIX}/sim_${FPGA_BOARD}/${VERILATOR_FPGA_BIN}: ${BUILD_FILES_PREFIX}/sim_${FPGA_BOARD}/${VERILATOR_FPGA_BIN}.mk
|
||||||
|
${Q}make ${MAKEOPTS} PRINT_PATH_PREFIX=${PRINT_PATH_PREFIX}${BUILD_FILES_PREFIX}/sim_${FPGA_BOARD}/ OPT_FAST="-O2 -march=native -mtune=native" -C "${BUILD_FILES_PREFIX}/sim_${FPGA_BOARD}/" -f ../../verilator_makefile_fpga Vfpga_top
|
||||||
|
|
||||||
|
${BUILD_FILES_PREFIX}/sim_${FPGA_BOARD}/${VERILATOR_FPGA_BIN}.mk: fpga_config/${FPGA_BOARD}/testbench.cpp ${FPGA_SIM_SOURCES}
|
||||||
|
${QUIET_VERILATOR}
|
||||||
|
mkdir -p "${BUILD_FILES_PREFIX}/sim_${FPGA_BOARD}/"
|
||||||
|
${Q}verilator -DCALCULATE_IPC -DOUTPUT_JSON_STATISTICS --Mdir ${BUILD_FILES_PREFIX}/sim_${FPGA_BOARD}/ ${VERILATOR_OPTS} ../../fpga_config/${FPGA_BOARD}/testbench.cpp ${FPGA_SIM_SOURCES}
|
||||||
|
|
||||||
|
.PHONY: fpga_sim
|
||||||
|
fpga_sim fpga_sim.fst: ${BUILD_FILES_PREFIX}/sim_${FPGA_BOARD}/${VERILATOR_FPGA_BIN} ${MICROCODE} simplified_ucode.txt ../boot_code/bios.stxt
|
||||||
|
$(call QUIET_VERILATOR_RUN,$(word 2,$^),$<)
|
||||||
|
${Q} ${NUMACTL} "${BUILD_FILES_PREFIX}/sim_${FPGA_BOARD}/${VERILATOR_FPGA_BIN}" +VERSION=${VERSION} +WAVEFORM="fpga_sim.fst" +COMMIT=${COMMIT} +BOOT_CODE="../boot_code/bios.stxt" +MICROCODE="simplified_ucode.txt"
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
#### FPGA/ASIC RECIPES ####
|
||||||
|
################################################################################
|
||||||
|
|
||||||
simplified_ucode.txt:ucode.txt
|
simplified_ucode.txt:ucode.txt
|
||||||
${Q}tr 'x' '0' < $^ | sed 's@//.*@@' | grep ^@ |sort | sed 's/.* .//;s/ $$//' | tr -d _ > $@
|
${Q}tr 'x' '0' < $^ | sed 's@//.*@@' | grep ^@ |sort | sed 's/.* .//;s/ $$//' | tr -d _ > $@
|
||||||
|
|
||||||
@ -93,15 +113,17 @@ external_ip/litedram_core_ecp5_phy.v:
|
|||||||
${QUIET_DOWNLOAD}
|
${QUIET_DOWNLOAD}
|
||||||
${Q}../tools/gen_litedram.sh -q "$@"
|
${Q}../tools/gen_litedram.sh -q "$@"
|
||||||
|
|
||||||
|
external_ip/litedram_core_ecp5_phy_sim.v:
|
||||||
|
${QUIET_DOWNLOAD}
|
||||||
|
${Q}../tools/gen_litedram.sh --simulation -q "$@"
|
||||||
|
|
||||||
#########################################
|
#########################################
|
||||||
## SYNTHESIS RECIPES
|
## SYNTHESIS RECIPES
|
||||||
|
|
||||||
SYNTHESIS_SOURCES ::= ${SOURCES} fpga_config/${FPGA_BOARD}/fpga_top.v ${SOC_SYNTHESIS_SOURCES} ${INCLUDES}
|
|
||||||
|
|
||||||
#TODO: we are relying on yosys to trim the input program txt file and hope its enough for the whole program...
|
#TODO: we are relying on yosys to trim the input program txt file and hope its enough for the whole program...
|
||||||
${BUILD_FILES_PREFIX}synth_ecp5_${FPGA_BOARD}.json: ${SYNTHESIS_SOURCES} ${FPGA_BOOTCODE} simplified_ucode.txt
|
${BUILD_FILES_PREFIX}synth_ecp5_${FPGA_BOARD}.json: ${FPGA_SOURCES} ${FPGA_BOOTCODE} simplified_ucode.txt
|
||||||
${QUIET_YOSYS}
|
${QUIET_YOSYS}
|
||||||
${Q} yosys -q -p 'read_verilog -defer -noautowire -sv '"${SYNTHESIS_SOURCES}; attrmap -tocase keep -imap keep="true" keep=1 -imap keep="false" keep=0 -remove keep=0; synth_ecp5 -json \"$@\" -abc9 -top fpga_top"
|
${Q} yosys -q -p 'read_verilog -defer -noautowire -sv '"${FPGA_SOURCES}; attrmap -tocase keep -imap keep="true" keep=1 -imap keep="false" keep=0 -remove keep=0; synth_ecp5 -json \"$@\" -abc9 -top fpga_top"
|
||||||
|
|
||||||
##########################################
|
##########################################
|
||||||
## PLACE AND ROUTE RECIPES
|
## PLACE AND ROUTE RECIPES
|
||||||
|
@ -18,7 +18,11 @@ ECP5_SPEED_GRADE=8
|
|||||||
|
|
||||||
######## End of user configuration ########
|
######## End of user configuration ########
|
||||||
|
|
||||||
SOC_SYNTHESIS_SOURCES=peripherals/I2C_driver.v peripherals/ascii_to_HD44780_driver.v peripherals/pcf8574_for_HD44780.v peripherals/Wishbone_IO_driver.v peripherals/Wishbone_memory_driver.v external_ip/litedram_core_ecp5_phy.v
|
#NOT USED OUTSIDE OF HERE
|
||||||
|
FPGA_SOC_COMMON_SOURCES=peripherals/I2C_driver.v peripherals/ascii_to_HD44780_driver.v peripherals/pcf8574_for_HD44780.v peripherals/Wishbone_IO_driver.v peripherals/Wishbone_memory_driver.v
|
||||||
|
|
||||||
|
FPGA_SOC_SOURCES=${FPGA_SOC_COMMON_SOURCES} external_ip/litedram_core_ecp5_phy.v
|
||||||
|
FPGA_SOC_SIM_SOURCES=${FPGA_SOC_COMMON_SOURCES} fpga_config/OrangeCrab_r0.2.1/verilator_config.vlt external_ip/litedram_core_ecp5_phy_sim.v
|
||||||
|
|
||||||
FPGA_BOOTCODE=../boot_code/bios.stxt
|
FPGA_BOOTCODE=../boot_code/bios.stxt
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ module fpga_top(
|
|||||||
output rgb_led0_g,
|
output rgb_led0_g,
|
||||||
output rgb_led0_b,
|
output rgb_led0_b,
|
||||||
|
|
||||||
|
`ifdef SYNTHESIS
|
||||||
output wire [15:0] ddram_a, // [15:13] are unused in litex as well, they just also route them through a trellis block
|
output wire [15:0] ddram_a, // [15:13] are unused in litex as well, they just also route them through a trellis block
|
||||||
output wire [2:0] ddram_ba,
|
output wire [2:0] ddram_ba,
|
||||||
output wire ddram_cas_n,
|
output wire ddram_cas_n,
|
||||||
@ -49,11 +50,53 @@ module fpga_top(
|
|||||||
|
|
||||||
inout gpio_0,/*sda*/
|
inout gpio_0,/*sda*/
|
||||||
output gpio_1 /*scl*/
|
output gpio_1 /*scl*/
|
||||||
|
`else
|
||||||
|
output i2c_dir,
|
||||||
|
output i2c_scl,
|
||||||
|
input i2c_sda_in,
|
||||||
|
output i2c_sda_out
|
||||||
|
`endif
|
||||||
);
|
);
|
||||||
|
|
||||||
|
`ifndef SYNTHESIS
|
||||||
|
string waveform_name;
|
||||||
|
initial begin
|
||||||
|
if($value$plusargs("WAVEFORM=%s",waveform_name))begin
|
||||||
|
$dumpfile(waveform_name);
|
||||||
|
$dumpvars(0,p,cycles);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
//TODO: should there be some common file between all the fpga_tops and system.v for this stuff?
|
||||||
|
always @(posedge clk48) begin
|
||||||
|
if(HALT==1&&disp_cache_start==disp_cache_end)begin
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
reg sane;
|
||||||
|
always @(posedge reset)begin sane<=1; end
|
||||||
|
always @( ERROR ) begin
|
||||||
|
if ( ERROR != `ERR_NO_ERROR && sane == 1 ) begin
|
||||||
|
$display("PROCESSOR RUN INTO AN ERROR.");
|
||||||
|
case (ERROR)
|
||||||
|
default:begin
|
||||||
|
end
|
||||||
|
`ERR_UNIMPL_INSTRUCTION:begin
|
||||||
|
$display("Unimplemented instruction");
|
||||||
|
end
|
||||||
|
`ERR_UNIMPL_ADDRESSING_MODE: begin
|
||||||
|
$display("Unimplemented addressing mode");
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
`endif
|
||||||
|
|
||||||
|
`ifdef SYNTHESIS
|
||||||
assign ddram_a[15:13] = 3'b0;
|
assign ddram_a[15:13] = 3'b0;
|
||||||
assign ddram_vccio = 6'd63;
|
assign ddram_vccio = 6'd63;
|
||||||
assign ddram_gnd = 2'd0;
|
assign ddram_gnd = 2'd0;
|
||||||
|
`endif
|
||||||
|
|
||||||
wire HALT;
|
wire HALT;
|
||||||
wire [`ERROR_BITS-1:0]ERROR;
|
wire [`ERROR_BITS-1:0]ERROR;
|
||||||
@ -85,6 +128,7 @@ processor p(
|
|||||||
`endif
|
`endif
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* verilator lint_off UNUSEDSIGNAL */
|
||||||
`ifdef CALCULATE_IPC
|
`ifdef CALCULATE_IPC
|
||||||
wire new_instruction;
|
wire new_instruction;
|
||||||
`endif
|
`endif
|
||||||
@ -93,6 +137,9 @@ wire [`L1_CACHE_SIZE-1:0]L1_SIZE_STAT;
|
|||||||
wire VALID_INSTRUCTION_STAT;
|
wire VALID_INSTRUCTION_STAT;
|
||||||
wire jump_req_debug;
|
wire jump_req_debug;
|
||||||
`endif
|
`endif
|
||||||
|
/* verilator lint_on UNUSEDSIGNAL */
|
||||||
|
|
||||||
|
|
||||||
reg [2:0]rgb_led_color;
|
reg [2:0]rgb_led_color;
|
||||||
assign rgb_led0_r=rgb_led_color[0];
|
assign rgb_led0_r=rgb_led_color[0];
|
||||||
assign rgb_led0_g=rgb_led_color[1];
|
assign rgb_led0_g=rgb_led_color[1];
|
||||||
@ -158,12 +205,15 @@ always @(posedge CPU_SPEED)begin
|
|||||||
disp_cache_end<=disp_cache_end+7'd1;
|
disp_cache_end<=disp_cache_end+7'd1;
|
||||||
end else if(IOMEM==1'b1 && address_bus[7:0]==8'hB0 )begin
|
end else if(IOMEM==1'b1 && address_bus[7:0]==8'hB0 )begin
|
||||||
if(data_bus_write[0:0]==1)
|
if(data_bus_write[0:0]==1)
|
||||||
rgb_led_color=3'b000;
|
rgb_led_color<=3'b000;
|
||||||
else
|
else
|
||||||
rgb_led_color=3'b111;
|
rgb_led_color<=3'b111;
|
||||||
end
|
end
|
||||||
end else if(ascii_state==1'b0)begin
|
end else if(ascii_state==1'b0)begin
|
||||||
if(ascii_data_ready&disp_cache_start!=disp_cache_end)begin
|
if(ascii_data_ready&disp_cache_start!=disp_cache_end)begin
|
||||||
|
`ifndef SYNTHESIS
|
||||||
|
$write("%s" ,disp_write_cache[disp_cache_start]); // TODO: maybe simulate the i2c lcd
|
||||||
|
`endif
|
||||||
ascii_data<=disp_write_cache[disp_cache_start];
|
ascii_data<=disp_write_cache[disp_cache_start];
|
||||||
disp_cache_start<=disp_cache_start+7'd1;
|
disp_cache_start<=disp_cache_start+7'd1;
|
||||||
ascii_data_write_req<=1;
|
ascii_data_write_req<=1;
|
||||||
@ -218,13 +268,14 @@ assign wishbone_cs=!((IOMEM==1)&&(address_bus[7:4] == 4'h4));
|
|||||||
/// DDR3 Controller
|
/// DDR3 Controller
|
||||||
|
|
||||||
wire ddr3_init_done,ddr3_init_error,ddr3_pll_locked;
|
wire ddr3_init_done,ddr3_init_error,ddr3_pll_locked;
|
||||||
|
/* verilator lint_off UNUSEDSIGNAL */
|
||||||
wire [31:0] ddr3_read_data;
|
wire user_rst;
|
||||||
wire [31:0] ddr3_write_data;
|
/* verilator lint_on UNUSEDSIGNAL */
|
||||||
|
`ifndef SYNTHESIS
|
||||||
reg [15:0]DDR3_data_bus_read;
|
assign ddr3_pll_locked=1;
|
||||||
|
wire sim_trace;
|
||||||
assign ddr3_write_data={16'd0,data_bus_write};
|
assign sim_trace=0;//signal is not connected on litedram, not sure what was the idea behind it
|
||||||
|
`endif
|
||||||
|
|
||||||
wire [15:0]Wishbone_driver_data_bus_read;
|
wire [15:0]Wishbone_driver_data_bus_read;
|
||||||
wire [15:0]Wishbone_driver_data_bus_write=data_bus_write;
|
wire [15:0]Wishbone_driver_data_bus_write=data_bus_write;
|
||||||
@ -317,9 +368,15 @@ litedram_core DDR3_RAM_DRIVER(
|
|||||||
////// GENERAL ///////
|
////// GENERAL ///////
|
||||||
.clk(clk48),
|
.clk(clk48),
|
||||||
.user_clk(CPU_SPEED),
|
.user_clk(CPU_SPEED),
|
||||||
|
`ifdef SYNTHESIS
|
||||||
.rst(!reset),
|
.rst(!reset),
|
||||||
|
.pll_locked(ddr3_pll_locked),
|
||||||
|
`else
|
||||||
|
.sim_trace(sim_trace),
|
||||||
|
`endif
|
||||||
|
|
||||||
////// DDR3 INTERFACE //////
|
////// DDR3 INTERFACE //////
|
||||||
|
`ifdef SYNTHESIS
|
||||||
.ddram_a(ddram_a[12:0]), //also ignored on the litedram core
|
.ddram_a(ddram_a[12:0]), //also ignored on the litedram core
|
||||||
.ddram_ba(ddram_ba),
|
.ddram_ba(ddram_ba),
|
||||||
.ddram_cas_n(ddram_cas_n),
|
.ddram_cas_n(ddram_cas_n),
|
||||||
@ -335,6 +392,7 @@ litedram_core DDR3_RAM_DRIVER(
|
|||||||
.ddram_ras_n(ddram_ras_n),
|
.ddram_ras_n(ddram_ras_n),
|
||||||
.ddram_reset_n(ddram_reset_n),
|
.ddram_reset_n(ddram_reset_n),
|
||||||
.ddram_we_n(ddram_we_n),
|
.ddram_we_n(ddram_we_n),
|
||||||
|
`endif
|
||||||
|
|
||||||
/////// SYSTEM MEMORY INTERFACE ////////////////
|
/////// SYSTEM MEMORY INTERFACE ////////////////
|
||||||
.init_done(ddr3_init_done),
|
.init_done(ddr3_init_done),
|
||||||
@ -348,8 +406,7 @@ litedram_core DDR3_RAM_DRIVER(
|
|||||||
.user_port_wishbone_0_sel(wb_mem_sel),
|
.user_port_wishbone_0_sel(wb_mem_sel),
|
||||||
.user_port_wishbone_0_stb(wb_mem_stb),
|
.user_port_wishbone_0_stb(wb_mem_stb),
|
||||||
.user_port_wishbone_0_we(wb_mem_we),
|
.user_port_wishbone_0_we(wb_mem_we),
|
||||||
.pll_locked(ddr3_pll_locked),
|
.user_rst(user_rst),
|
||||||
//output wire user_rst,
|
|
||||||
|
|
||||||
/////// WISHBONE CONTROL INTERFACE ///////////
|
/////// WISHBONE CONTROL INTERFACE ///////////
|
||||||
.wb_ctrl_ack(wb_ctrl_ack),
|
.wb_ctrl_ack(wb_ctrl_ack),
|
||||||
@ -412,8 +469,8 @@ pcf8574_for_HD44780 PCF8574_driver(
|
|||||||
|
|
||||||
// I2C driver
|
// I2C driver
|
||||||
|
|
||||||
wire SCL,SDA_input,SDA_output,SDA_direction,I2C_BUSY,I2C_SEND;
|
wire SDA_direction;
|
||||||
assign gpio_1=SCL;
|
wire SCL,SDA_input,SDA_output,I2C_BUSY,I2C_SEND;
|
||||||
|
|
||||||
I2C_driver i2c_driver(
|
I2C_driver i2c_driver(
|
||||||
.clock(I2C_SPEED),
|
.clock(I2C_SPEED),
|
||||||
@ -429,6 +486,8 @@ I2C_driver i2c_driver(
|
|||||||
.i2c_data(i2c_data)
|
.i2c_data(i2c_data)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
`ifdef SYNTHESIS
|
||||||
|
|
||||||
TRELLIS_IO #(
|
TRELLIS_IO #(
|
||||||
// Parameters.
|
// Parameters.
|
||||||
.DIR ("BIDIR")
|
.DIR ("BIDIR")
|
||||||
@ -443,5 +502,16 @@ TRELLIS_IO #(
|
|||||||
.O (SDA_input)
|
.O (SDA_input)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assign gpio_1=SCL;
|
||||||
|
|
||||||
|
`else
|
||||||
|
|
||||||
|
assign i2c_dir=SDA_direction;
|
||||||
|
assign i2c_scl=SCL;
|
||||||
|
assign SDA_input=i2c_sda_in;
|
||||||
|
assign i2c_sda_out=SDA_output;
|
||||||
|
|
||||||
|
`endif
|
||||||
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
54
system/fpga_config/OrangeCrab_r0.2.1/testbench.cpp
Normal file
54
system/fpga_config/OrangeCrab_r0.2.1/testbench.cpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#include "Vfpga_top.h"
|
||||||
|
#include "verilated.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
|
||||||
|
Vfpga_top *system_state;
|
||||||
|
VerilatedContext* contextp;
|
||||||
|
|
||||||
|
/*In hz */
|
||||||
|
#define CPU_SPEED 1000
|
||||||
|
|
||||||
|
#define timeinc CPU_SPEED*1000000/2
|
||||||
|
|
||||||
|
void tick() {
|
||||||
|
system_state->clk48 = 1;
|
||||||
|
contextp->timeInc(timeinc);
|
||||||
|
system_state->eval();
|
||||||
|
system_state->clk48 = 0;
|
||||||
|
contextp->timeInc(timeinc);
|
||||||
|
system_state->eval();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
contextp = new VerilatedContext;
|
||||||
|
|
||||||
|
// Set debug level, 0 is off, 9 is highest presently used
|
||||||
|
// May be overridden by commandArgs argument parsing
|
||||||
|
contextp->debug(0);
|
||||||
|
|
||||||
|
// Verilator must compute traced signals
|
||||||
|
contextp->traceEverOn(true);
|
||||||
|
|
||||||
|
contextp->commandArgs(argc, argv);
|
||||||
|
system_state = new Vfpga_top{contextp};
|
||||||
|
system_state->user_button=1;
|
||||||
|
|
||||||
|
//system_state->reset=1;
|
||||||
|
tick();
|
||||||
|
//system_state->reset=0;
|
||||||
|
tick();
|
||||||
|
tick();
|
||||||
|
//system_state->reset=1;
|
||||||
|
|
||||||
|
// Simulate until $finish
|
||||||
|
while(!contextp->gotFinish()){
|
||||||
|
tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
system_state->final();
|
||||||
|
|
||||||
|
delete system_state;
|
||||||
|
delete contextp;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
|||||||
|
`verilator_config
|
||||||
|
lint_off -rule COMBDLY -file "external_ip/litedram_core_ecp5_phy_sim.v"
|
||||||
|
lint_off -rule CASEINCOMPLETE -file "external_ip/litedram_core_ecp5_phy_sim.v"
|
||||||
|
lint_off -rule UNUSEDSIGNAL -file "external_ip/litedram_core_ecp5_phy_sim.v"
|
||||||
|
lint_off -rule WIDTHEXPAND -file "external_ip/litedram_core_ecp5_phy_sim.v"
|
||||||
|
lint_off -rule WIDTHTRUNC -file "external_ip/litedram_core_ecp5_phy_sim.v"
|
@ -45,7 +45,7 @@ initial begin
|
|||||||
$display("No boot code specified. Please add +BOOT_CODE=<path> to your vvp args");
|
$display("No boot code specified. Please add +BOOT_CODE=<path> to your vvp args");
|
||||||
$finish;
|
$finish;
|
||||||
end
|
end
|
||||||
$readmemh(boot_code, memory,0,32767);
|
$readmemh(boot_code, memory,0,(RAM_SIZE_IN_BYTES/2)-1);
|
||||||
`else
|
`else
|
||||||
//TODO: don't have it hard coded
|
//TODO: don't have it hard coded
|
||||||
$readmemh("../boot_code/bios.stxt", memory,0,(RAM_SIZE_IN_BYTES/2)-1); // 2KiB
|
$readmemh("../boot_code/bios.stxt", memory,0,(RAM_SIZE_IN_BYTES/2)-1); // 2KiB
|
||||||
|
@ -19,7 +19,9 @@
|
|||||||
|
|
||||||
module I2C_driver (
|
module I2C_driver (
|
||||||
input wire clock,
|
input wire clock,
|
||||||
|
/* verilator lint_off UNUSEDSIGNAL */
|
||||||
input wire SDA_input,
|
input wire SDA_input,
|
||||||
|
/* verilator lint_on UNUSEDSIGNAL */
|
||||||
output wire SDA_output,
|
output wire SDA_output,
|
||||||
output reg SDA_direction, //1:output 0:input
|
output reg SDA_direction, //1:output 0:input
|
||||||
output reg SCL,
|
output reg SCL,
|
||||||
|
@ -19,7 +19,10 @@
|
|||||||
|
|
||||||
module Wishbone_memory_driver (
|
module Wishbone_memory_driver (
|
||||||
input wire clock,
|
input wire clock,
|
||||||
|
|
||||||
|
/* verilator lint_off UNUSEDSIGNAL */
|
||||||
input wire reset_n,
|
input wire reset_n,
|
||||||
|
/* verilator lint_on UNUSEDSIGNAL */
|
||||||
|
|
||||||
input wire [19:0] address,
|
input wire [19:0] address,
|
||||||
input wire [15:0] data_bus_in,
|
input wire [15:0] data_bus_in,
|
||||||
@ -33,12 +36,18 @@ module Wishbone_memory_driver (
|
|||||||
input wire wb_mem_ack,
|
input wire wb_mem_ack,
|
||||||
output wire [24:0] wb_mem_adr,
|
output wire [24:0] wb_mem_adr,
|
||||||
output reg wb_mem_cyc,
|
output reg wb_mem_cyc,
|
||||||
|
|
||||||
/* verilator lint_off UNUSEDSIGNAL */
|
/* verilator lint_off UNUSEDSIGNAL */
|
||||||
// I don't yet use the upper word
|
// I don't yet use the upper word
|
||||||
input wire [31:0] wb_mem_data_r,
|
input wire [31:0] wb_mem_data_r,
|
||||||
/* verilator lint_on UNUSEDSIGNAL */
|
/* verilator lint_on UNUSEDSIGNAL */
|
||||||
|
|
||||||
output wire [31:0] wb_mem_data_w,
|
output wire [31:0] wb_mem_data_w,
|
||||||
|
|
||||||
|
/* verilator lint_off UNUSEDSIGNAL */
|
||||||
input wire wb_mem_err,
|
input wire wb_mem_err,
|
||||||
|
/* verilator lint_on UNUSEDSIGNAL */
|
||||||
|
|
||||||
output wire [3:0] wb_mem_sel,
|
output wire [3:0] wb_mem_sel,
|
||||||
output reg wb_mem_stb,
|
output reg wb_mem_stb,
|
||||||
output wire wb_mem_we
|
output wire wb_mem_we
|
||||||
@ -53,7 +62,7 @@ always @(posedge clock)begin
|
|||||||
end
|
end
|
||||||
|
|
||||||
always @(posedge wb_mem_ack)begin
|
always @(posedge wb_mem_ack)begin
|
||||||
data_bus_out=wb_mem_data_r[15:0];
|
data_bus_out<=wb_mem_data_r[15:0];
|
||||||
end
|
end
|
||||||
assign wb_mem_data_w={16'd0,data_bus_in};
|
assign wb_mem_data_w={16'd0,data_bus_in};
|
||||||
|
|
||||||
|
@ -26,7 +26,9 @@ input wire pcf_write_req,
|
|||||||
input wire pcf_command_data,
|
input wire pcf_command_data,
|
||||||
input wire [3:0]pcf_data,
|
input wire [3:0]pcf_data,
|
||||||
output reg pcf_busy=0,
|
output reg pcf_busy=0,
|
||||||
|
/* verilator lint_off UNUSEDSIGNAL */
|
||||||
input new_backlight,
|
input new_backlight,
|
||||||
|
/* verilator lint_on UNUSEDSIGNAL */
|
||||||
input backlight_update,
|
input backlight_update,
|
||||||
|
|
||||||
input I2C_BUSY,
|
input I2C_BUSY,
|
||||||
|
21
system/verilator_makefile_fpga
Normal file
21
system/verilator_makefile_fpga
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# This file is basically to make verilator compilation look pretty.
|
||||||
|
# If the project doesn't compile it might be because verilator handles compilation
|
||||||
|
# differently and this patch doesn't work anymore. In such case remove everything
|
||||||
|
# except the include Vsystem.mk line and try again.
|
||||||
|
VM_DEFAULT_RULES=0
|
||||||
|
|
||||||
|
include Vfpga_top.mk
|
||||||
|
|
||||||
|
include ../../../common.mk
|
||||||
|
|
||||||
|
%.o: %.cpp
|
||||||
|
${QUIET_CC}
|
||||||
|
${Q}$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_FAST) -c -o $@ $<
|
||||||
|
|
||||||
|
$(VK_SLOW_OBJS): %.o: %.cpp
|
||||||
|
${QUIET_CC}
|
||||||
|
${Q}$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_SLOW) -c -o $@ $<
|
||||||
|
|
||||||
|
$(VK_GLOBAL_OBJS): %.o: %.cpp
|
||||||
|
${QUIET_CC}
|
||||||
|
${Q}$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_GLOBAL) -c -o $@ $<
|
@ -7,6 +7,7 @@ PYTHON_APPIMAGE_URL=https://github.com/niess/python-appimage/releases/download/p
|
|||||||
PYTHON_APPIMAGE_SUM=8c383ade3ace416cf508d5f458b30149
|
PYTHON_APPIMAGE_SUM=8c383ade3ace416cf508d5f458b30149
|
||||||
|
|
||||||
OUTPUT_ECP5_1_WISHBONE_MD5=c775ddb23fd97211f3ace40d6e8c2a5f
|
OUTPUT_ECP5_1_WISHBONE_MD5=c775ddb23fd97211f3ace40d6e8c2a5f
|
||||||
|
OUTPUT_ECP5_1_WISHBONE_SIM_MD5=06d0b073d06937312b425767c1895c6c
|
||||||
|
|
||||||
|
|
||||||
help(){
|
help(){
|
||||||
@ -21,6 +22,7 @@ STOP_PARSING=0
|
|||||||
OUT_FILE=""
|
OUT_FILE=""
|
||||||
QUIET=0
|
QUIET=0
|
||||||
FORCE=0
|
FORCE=0
|
||||||
|
SIMULATION=0
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
if [ "$STOP_PARSING" = "1" ]
|
if [ "$STOP_PARSING" = "1" ]
|
||||||
then
|
then
|
||||||
@ -41,6 +43,10 @@ while [ $# -gt 0 ]; do
|
|||||||
FORCE=1
|
FORCE=1
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
-s|--simulation)
|
||||||
|
SIMULATION=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
--)
|
--)
|
||||||
if ! [ $# -gt 1 ]
|
if ! [ $# -gt 1 ]
|
||||||
then
|
then
|
||||||
@ -125,6 +131,17 @@ PYTHON=$(realpath squashfs-root/AppRun)
|
|||||||
mkdir python_modules
|
mkdir python_modules
|
||||||
PYTHON_MODULES=$(realpath python_modules)
|
PYTHON_MODULES=$(realpath python_modules)
|
||||||
|
|
||||||
|
######### This is a patch ############
|
||||||
|
# It's because litedram needs modules
|
||||||
|
# it doesn't really use for --sim and
|
||||||
|
# pip doesn't currently have some
|
||||||
|
wget --quiet https://github.com/enjoy-digital/litescope/archive/refs/tags/2023.08.tar.gz
|
||||||
|
tar xf 2023.08.tar.gz
|
||||||
|
mv litescope-2023.08/litescope/ "${PYTHON_MODULES}"
|
||||||
|
rm -r litescope-2023.08 2023.08.tar.gz
|
||||||
|
######################################
|
||||||
|
|
||||||
|
|
||||||
if [ "$QUIET" = 0 ];then
|
if [ "$QUIET" = 0 ];then
|
||||||
echo extracting the source...
|
echo extracting the source...
|
||||||
fi
|
fi
|
||||||
@ -148,7 +165,7 @@ if [ "$QUIET" = 0 ];then
|
|||||||
echo Downloading required python modules...
|
echo Downloading required python modules...
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! "$PYTHON" -m pip install --target "$PYTHON_MODULES" install "pyaml==23.9.7" "migen==0.9.2" "litex==2023.08" "litedram==2023.8" > "$TEMP_DIR/build_log" 2> "$TEMP_DIR/build_log"
|
if ! "$PYTHON" -m pip install --target "$PYTHON_MODULES" install "pyaml==23.9.7" "migen==0.9.2" "litex==2023.08" "litedram==2023.8" "liteeth==2022.12" "liteiclink==2022.12" "pythondata_misc_tapcfg" > "$TEMP_DIR/build_log" 2> "$TEMP_DIR/build_log"
|
||||||
then
|
then
|
||||||
echo ERROR: Failed download python modules
|
echo ERROR: Failed download python modules
|
||||||
cat "$TEMP_DIR/build_log"
|
cat "$TEMP_DIR/build_log"
|
||||||
@ -164,7 +181,14 @@ fi
|
|||||||
|
|
||||||
cd build/lib/litedram/
|
cd build/lib/litedram/
|
||||||
|
|
||||||
if ! PYTHONPATH=$PYTHON_MODULES "$PYTHON" gen.py ../../../examples/orangecrab_9086.yml --no-compile-software > "$TEMP_DIR/build_log" 2> "$TEMP_DIR/build_log"
|
GEN_OPTIONS=""
|
||||||
|
|
||||||
|
if [ $SIMULATION = 1 ]
|
||||||
|
then
|
||||||
|
GEN_OPTIONS="$GEN_OPTIONS --sim"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! PYTHONPATH=$PYTHON_MODULES "$PYTHON" gen.py $GEN_OPTIONS ../../../examples/orangecrab_9086.yml --no-compile-software > "$TEMP_DIR/build_log" 2> "$TEMP_DIR/build_log"
|
||||||
then
|
then
|
||||||
echo ERROR: Failed to run gen.py
|
echo ERROR: Failed to run gen.py
|
||||||
cat "$TEMP_DIR/build_log"
|
cat "$TEMP_DIR/build_log"
|
||||||
@ -174,10 +198,18 @@ fi
|
|||||||
if [ "$QUIET" = 0 ];then
|
if [ "$QUIET" = 0 ];then
|
||||||
echo patching source file...
|
echo patching source file...
|
||||||
fi
|
fi
|
||||||
#This is just for some yosys warnings...
|
|
||||||
echo H4sIAAAAAAACA82T326CMBTG73mKc7XBECnKAHUkvMeyNEdatZE/hiLEzPnsa5nL4pYh3izrTduc3/d9Jyet4ziw3IuMuWuseYsVdzNRc1ZhTtOy4uMGJmQydTzPmYRAgrkfzEk4noYzEgZh5INN1DJs2waX8cYt9lkG3yWRUo1nj5FPvMALzpIkASci/nQUgt3tASSJASilWBfw+tmFboKylaA7j7YVwxpH8LNGzrU3iC+roqh5tcKU01bXF/8igOYot30pHaCjzFNfGG25tTCcvw4EzFo8SEjMBwuWfC0KA/S6UKabspRqyxltMBNMwlMM0T0jiyHwM3nRvHlBLbHY5phuRMHJFwt3YJpXwB0eshIZFVJfleK39BaLWh+k1dmehhpXKLXgNIxOUVrWDbyauuKP/V1jWotG/WFlbRzhholUHBnEcb+7hj6GMti3rRR51bijVM+Weljv0yEXHY0EAAA= | base64 -d | gzip -d | patch -s -p0
|
|
||||||
|
|
||||||
if ! [ "$(sed 's@//.*@@' build/gateware/litedram_core.v | md5sum )" = "$OUTPUT_ECP5_1_WISHBONE_MD5 -" ]
|
if [ "$SIMULATION" = 0 ]
|
||||||
|
then
|
||||||
|
#This is just for some yosys warnings...
|
||||||
|
echo H4sIAAAAAAACA82T326CMBTG73mKc7XBECnKAHUkvMeyNEdatZE/hiLEzPnsa5nL4pYh3izrTduc3/d9Jyet4ziw3IuMuWuseYsVdzNRc1ZhTtOy4uMGJmQydTzPmYRAgrkfzEk4noYzEgZh5INN1DJs2waX8cYt9lkG3yWRUo1nj5FPvMALzpIkASci/nQUgt3tASSJASilWBfw+tmFboKylaA7j7YVwxpH8LNGzrU3iC+roqh5tcKU01bXF/8igOYot30pHaCjzFNfGG25tTCcvw4EzFo8SEjMBwuWfC0KA/S6UKabspRqyxltMBNMwlMM0T0jiyHwM3nRvHlBLbHY5phuRMHJFwt3YJpXwB0eshIZFVJfleK39BaLWh+k1dmehhpXKLXgNIxOUVrWDbyauuKP/V1jWotG/WFlbRzhholUHBnEcb+7hj6GMti3rRR51bijVM+Weljv0yEXHY0EAAA= | base64 -d | gzip -d | patch -s -p0
|
||||||
|
CHECK_MD5SUM=$OUTPUT_ECP5_1_WISHBONE_MD5
|
||||||
|
else
|
||||||
|
echo H4sIAAAAAAACA7WPOQ7CMBREe59ievPjPVvlC3AGMLGFIpkEZeP6pKBCoguvmPLNDBHhtvY5intY0itMSeR+SXEKj0s3TqnYAGipDSlNsoIqW2laVxWNaXTZWKfB5Q7jnEPEtIlhzRk/+BLZ1srCVLYuldPVR+Q9SJlTDb6ng/cMQtChMEbXpX+kuQs5QQ0zBNRzZsTo8Kp9PM5jXHP6x483iNz1Tr8BAAA= | base64 -d | gzip -d | patch -s -p0
|
||||||
|
CHECK_MD5SUM=$OUTPUT_ECP5_1_WISHBONE_SIM_MD5
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ "$(sed 's@//.*@@' build/gateware/litedram_core.v | md5sum )" = "$CHECK_MD5SUM -" ]
|
||||||
then
|
then
|
||||||
if [ "$FORCE" = 0 ]
|
if [ "$FORCE" = 0 ]
|
||||||
then
|
then
|
||||||
|
Loading…
Reference in New Issue
Block a user