Lots of changes, trying to get ROM working
All checks were successful
ci/woodpecker/push/test-workflow Pipeline was successful
All checks were successful
ci/woodpecker/push/test-workflow Pipeline was successful
I think I did some funny math errors so new goal is 8-bit pcm
This commit is contained in:
parent
02e2d77640
commit
7980424dc8
@ -31,7 +31,7 @@ set_property CONFIG_VOLTAGE 3.3 [current_design]
|
|||||||
#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15]
|
#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15]
|
||||||
|
|
||||||
## LEDs
|
## LEDs
|
||||||
#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L18P_T2_A24_15 Sch=led[0]
|
set_property -dict {PACKAGE_PIN H17 IOSTANDARD LVCMOS33} [get_ports {LED[0]}]
|
||||||
#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1]
|
#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1]
|
||||||
#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L17N_T2_A25_15 Sch=led[2]
|
#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L17N_T2_A25_15 Sch=led[2]
|
||||||
#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8P_T1_D11_14 Sch=led[3]
|
#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8P_T1_D11_14 Sch=led[3]
|
||||||
@ -182,8 +182,8 @@ set_property -dict {PACKAGE_PIN M17 IOSTANDARD LVCMOS33} [get_ports BTNR]
|
|||||||
#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { M_LRSEL }]; #IO_0_35 Sch=m_lrsel
|
#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { M_LRSEL }]; #IO_0_35 Sch=m_lrsel
|
||||||
|
|
||||||
##PWM Audio Amplifier
|
##PWM Audio Amplifier
|
||||||
#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { AUD_PWM }]; #IO_L4N_T0_15 Sch=aud_pwm
|
set_property -dict {PACKAGE_PIN A11 IOSTANDARD LVCMOS33} [get_ports AUD_PWM]
|
||||||
#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { AUD_SD }]; #IO_L6P_T0_15 Sch=aud_sd
|
set_property -dict {PACKAGE_PIN D12 IOSTANDARD LVCMOS33} [get_ports AUD_SD]
|
||||||
|
|
||||||
##USB-RS232 Interface
|
##USB-RS232 Interface
|
||||||
#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { UART_TXD_IN }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in
|
#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { UART_TXD_IN }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in
|
||||||
@ -216,69 +216,3 @@ set_property -dict {PACKAGE_PIN M17 IOSTANDARD LVCMOS33} [get_ports BTNR]
|
|||||||
#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3]
|
#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3]
|
||||||
#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn
|
#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn
|
||||||
|
|
||||||
create_debug_core u_ila_0 ila
|
|
||||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
|
|
||||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
|
|
||||||
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_0]
|
|
||||||
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_0]
|
|
||||||
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_0]
|
|
||||||
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
|
|
||||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
|
|
||||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/clk]
|
|
||||||
connect_debug_port u_ila_0/clk [get_nets [list CLK100MHZ_IBUF_BUFG]]
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
|
|
||||||
set_property port_width 6 [get_debug_ports u_ila_0/probe0]
|
|
||||||
connect_debug_port u_ila_0/probe0 [get_nets [list {seconds_reg[0]} {seconds_reg[1]} {seconds_reg[2]} {seconds_reg[3]} {seconds_reg[4]} {seconds_reg[5]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
|
|
||||||
set_property port_width 6 [get_debug_ports u_ila_0/probe1]
|
|
||||||
connect_debug_port u_ila_0/probe1 [get_nets [list {minutes[0]} {minutes[1]} {minutes[2]} {minutes[3]} {minutes[4]} {minutes[5]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
|
|
||||||
set_property port_width 3 [get_debug_ports u_ila_0/probe2]
|
|
||||||
connect_debug_port u_ila_0/probe2 [get_nets [list {playbackController/current[0]} {playbackController/current[1]} {playbackController/current[2]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
|
|
||||||
set_property port_width 6 [get_debug_ports u_ila_0/probe3]
|
|
||||||
connect_debug_port u_ila_0/probe3 [get_nets [list {hours_reg[0]} {hours_reg[1]} {hours_reg[2]} {hours_reg[3]} {hours_reg[4]} {hours_reg[5]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
|
|
||||||
set_property port_width 3 [get_debug_ports u_ila_0/probe4]
|
|
||||||
connect_debug_port u_ila_0/probe4 [get_nets [list {anodeDriver/mux_select[0]} {anodeDriver/mux_select[1]} {anodeDriver/mux_select[2]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
|
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe5]
|
|
||||||
connect_debug_port u_ila_0/probe5 [get_nets [list {AN_OBUF[0]} {AN_OBUF[1]} {AN_OBUF[2]} {AN_OBUF[3]} {AN_OBUF[4]} {AN_OBUF[5]} {AN_OBUF[6]} {AN_OBUF[7]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe6]
|
|
||||||
connect_debug_port u_ila_0/probe6 [get_nets [list CA_OBUF]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe7]
|
|
||||||
connect_debug_port u_ila_0/probe7 [get_nets [list CB_OBUF]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe8]
|
|
||||||
connect_debug_port u_ila_0/probe8 [get_nets [list CC_OBUF]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe9]
|
|
||||||
connect_debug_port u_ila_0/probe9 [get_nets [list CD_OBUF]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe10]
|
|
||||||
connect_debug_port u_ila_0/probe10 [get_nets [list CE_OBUF]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe11]
|
|
||||||
connect_debug_port u_ila_0/probe11 [get_nets [list CF_OBUF]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe12]
|
|
||||||
connect_debug_port u_ila_0/probe12 [get_nets [list CG_OBUF]]
|
|
||||||
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
|
|
||||||
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
|
|
||||||
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
|
|
||||||
connect_debug_port dbg_hub/clk [get_nets CLK100MHZ_IBUF_BUFG]
|
|
||||||
|
|||||||
277
SDVD.xpr
277
SDVD.xpr
@ -44,7 +44,8 @@
|
|||||||
<Option Name="SimulatorGccVersionRiviera" Val="9.3.0"/>
|
<Option Name="SimulatorGccVersionRiviera" Val="9.3.0"/>
|
||||||
<Option Name="SimulatorGccVersionActiveHdl" Val="9.3.0"/>
|
<Option Name="SimulatorGccVersionActiveHdl" Val="9.3.0"/>
|
||||||
<Option Name="BoardPart" Val=""/>
|
<Option Name="BoardPart" Val=""/>
|
||||||
<Option Name="ActiveSimSet" Val="sim_1"/>
|
<Option Name="SourceMgmtMode" Val="DisplayOnly"/>
|
||||||
|
<Option Name="ActiveSimSet" Val="rom_sd_tb"/>
|
||||||
<Option Name="DefaultLib" Val="xil_defaultlib"/>
|
<Option Name="DefaultLib" Val="xil_defaultlib"/>
|
||||||
<Option Name="ProjectType" Val="Default"/>
|
<Option Name="ProjectType" Val="Default"/>
|
||||||
<Option Name="IPRepoPath" Val="$PPRDIR/../../../fpga/vivado-library"/>
|
<Option Name="IPRepoPath" Val="$PPRDIR/../../../fpga/vivado-library"/>
|
||||||
@ -60,7 +61,7 @@
|
|||||||
<Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/>
|
<Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/>
|
||||||
<Option Name="EnableBDX" Val="FALSE"/>
|
<Option Name="EnableBDX" Val="FALSE"/>
|
||||||
<Option Name="DSABoardId" Val="nexys-a7-100t"/>
|
<Option Name="DSABoardId" Val="nexys-a7-100t"/>
|
||||||
<Option Name="WTXSimLaunchSim" Val="87"/>
|
<Option Name="WTXSimLaunchSim" Val="133"/>
|
||||||
<Option Name="WTModelSimLaunchSim" Val="0"/>
|
<Option Name="WTModelSimLaunchSim" Val="0"/>
|
||||||
<Option Name="WTQuestaLaunchSim" Val="0"/>
|
<Option Name="WTQuestaLaunchSim" Val="0"/>
|
||||||
<Option Name="WTIesLaunchSim" Val="0"/>
|
<Option Name="WTIesLaunchSim" Val="0"/>
|
||||||
@ -91,6 +92,27 @@
|
|||||||
<FileSets Version="1" Minor="32">
|
<FileSets Version="1" Minor="32">
|
||||||
<FileSet Name="sources_1" Type="DesignSrcs" RelSrcDir="$PSRCDIR/sources_1" RelGenDir="$PGENDIR/sources_1">
|
<FileSet Name="sources_1" Type="DesignSrcs" RelSrcDir="$PSRCDIR/sources_1" RelGenDir="$PGENDIR/sources_1">
|
||||||
<Filter Type="Srcs"/>
|
<Filter Type="Srcs"/>
|
||||||
|
<File Path="$PPRDIR/lib/audio_buffer_interface.sv">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
|
<File Path="$PPRDIR/lib/sdvd_defs.sv">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
|
<File Path="$PPRDIR/design/audio/audio_buffer.sv">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
<File Path="$PPRDIR/design/debouncer.sv">
|
<File Path="$PPRDIR/design/debouncer.sv">
|
||||||
<FileInfo>
|
<FileInfo>
|
||||||
<Attr Name="UsedIn" Val="synthesis"/>
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
@ -119,6 +141,13 @@
|
|||||||
<Attr Name="UsedIn" Val="simulation"/>
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
</FileInfo>
|
</FileInfo>
|
||||||
</File>
|
</File>
|
||||||
|
<File Path="$PPRDIR/design/modular_clock_gen.sv">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
<File Path="$PPRDIR/design/playback_controller.sv">
|
<File Path="$PPRDIR/design/playback_controller.sv">
|
||||||
<FileInfo>
|
<FileInfo>
|
||||||
<Attr Name="UsedIn" Val="synthesis"/>
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
@ -126,6 +155,20 @@
|
|||||||
<Attr Name="UsedIn" Val="simulation"/>
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
</FileInfo>
|
</FileInfo>
|
||||||
</File>
|
</File>
|
||||||
|
<File Path="$PPRDIR/design/audio/pwm.sv">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
|
<File Path="$PPRDIR/design/sd/rom_sd.sv">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
<File Path="$PPRDIR/design/segment_display/seconds_display.sv">
|
<File Path="$PPRDIR/design/segment_display/seconds_display.sv">
|
||||||
<FileInfo>
|
<FileInfo>
|
||||||
<Attr Name="UsedIn" Val="synthesis"/>
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
@ -140,27 +183,16 @@
|
|||||||
<Attr Name="UsedIn" Val="simulation"/>
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
</FileInfo>
|
</FileInfo>
|
||||||
</File>
|
</File>
|
||||||
<File Path="$PPRDIR/design/sdvd_defs.sv">
|
<File Path="$PPRDIR/lib/assertion_error.sv">
|
||||||
<FileInfo>
|
<FileInfo>
|
||||||
<Attr Name="AutoDisabled" Val="1"/>
|
|
||||||
<Attr Name="UsedIn" Val="synthesis"/>
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
<Attr Name="UsedIn" Val="implementation"/>
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
<Attr Name="UsedIn" Val="simulation"/>
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
</FileInfo>
|
</FileInfo>
|
||||||
</File>
|
</File>
|
||||||
<File Path="$PPRDIR/design/audio/audio_buffer.sv">
|
<File Path="$PPRDIR/roms/roundabout.mem">
|
||||||
<FileInfo>
|
<FileInfo>
|
||||||
<Attr Name="AutoDisabled" Val="1"/>
|
|
||||||
<Attr Name="UsedIn" Val="synthesis"/>
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
<Attr Name="UsedIn" Val="implementation"/>
|
|
||||||
<Attr Name="UsedIn" Val="simulation"/>
|
|
||||||
</FileInfo>
|
|
||||||
</File>
|
|
||||||
<File Path="$PPRDIR/design/audio/pwm.sv">
|
|
||||||
<FileInfo>
|
|
||||||
<Attr Name="AutoDisabled" Val="1"/>
|
|
||||||
<Attr Name="UsedIn" Val="synthesis"/>
|
|
||||||
<Attr Name="UsedIn" Val="implementation"/>
|
|
||||||
<Attr Name="UsedIn" Val="simulation"/>
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
</FileInfo>
|
</FileInfo>
|
||||||
</File>
|
</File>
|
||||||
@ -169,6 +201,7 @@
|
|||||||
<Option Name="TopModule" Val="nexys_a7_top"/>
|
<Option Name="TopModule" Val="nexys_a7_top"/>
|
||||||
<Option Name="TopAutoSet" Val="TRUE"/>
|
<Option Name="TopAutoSet" Val="TRUE"/>
|
||||||
<Option Name="VerilogDir" Val="$PPRDIR/design"/>
|
<Option Name="VerilogDir" Val="$PPRDIR/design"/>
|
||||||
|
<Option Name="VerilogDir" Val="$PPRDIR/lib"/>
|
||||||
</Config>
|
</Config>
|
||||||
</FileSet>
|
</FileSet>
|
||||||
<FileSet Name="constrs_1" Type="Constrs" RelSrcDir="$PSRCDIR/constrs_1" RelGenDir="$PGENDIR/constrs_1">
|
<FileSet Name="constrs_1" Type="Constrs" RelSrcDir="$PSRCDIR/constrs_1" RelGenDir="$PGENDIR/constrs_1">
|
||||||
@ -260,16 +293,15 @@
|
|||||||
</FileSet>
|
</FileSet>
|
||||||
<FileSet Name="playback_controller_tb" Type="SimulationSrcs" RelSrcDir="$PSRCDIR/playback_controller_tb" RelGenDir="$PGENDIR/playback_controller_tb">
|
<FileSet Name="playback_controller_tb" Type="SimulationSrcs" RelSrcDir="$PSRCDIR/playback_controller_tb" RelGenDir="$PGENDIR/playback_controller_tb">
|
||||||
<Filter Type="Srcs"/>
|
<Filter Type="Srcs"/>
|
||||||
<File Path="$PPRDIR/verification/playback_controller_tb.sv">
|
<File Path="$PPRDIR/lib/sdvd_defs.sv">
|
||||||
<FileInfo>
|
<FileInfo>
|
||||||
<Attr Name="UsedIn" Val="synthesis"/>
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
<Attr Name="UsedIn" Val="implementation"/>
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
<Attr Name="UsedIn" Val="simulation"/>
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
</FileInfo>
|
</FileInfo>
|
||||||
</File>
|
</File>
|
||||||
<File Path="$PPRDIR/design/sdvd_defs.sv">
|
<File Path="$PPRDIR/verification/playback_controller_tb.sv">
|
||||||
<FileInfo>
|
<FileInfo>
|
||||||
<Attr Name="AutoDisabled" Val="1"/>
|
|
||||||
<Attr Name="UsedIn" Val="synthesis"/>
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
<Attr Name="UsedIn" Val="implementation"/>
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
<Attr Name="UsedIn" Val="simulation"/>
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
@ -320,6 +352,78 @@
|
|||||||
<Option Name="xsim.simulate.runtime" Val="10s"/>
|
<Option Name="xsim.simulate.runtime" Val="10s"/>
|
||||||
</Config>
|
</Config>
|
||||||
</FileSet>
|
</FileSet>
|
||||||
|
<FileSet Name="rom_sd_tb" Type="SimulationSrcs" RelSrcDir="$PSRCDIR/rom_sd_tb" RelGenDir="$PGENDIR/rom_sd_tb">
|
||||||
|
<Filter Type="Srcs"/>
|
||||||
|
<File Path="$PPRDIR/roms/testfile.mem">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
|
<File Path="$PPRDIR/verification/sd/rom_sd_tb.sv">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
|
<File Path="$PPRDIR/verification/waveform_configs/rom_sd_waveform.wcfg">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
|
<File Path="$PPRDIR/roms/consecutive.mem">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
|
<Config>
|
||||||
|
<Option Name="DesignMode" Val="RTL"/>
|
||||||
|
<Option Name="TopModule" Val="rom_sd_tb"/>
|
||||||
|
<Option Name="TopLib" Val="xil_defaultlib"/>
|
||||||
|
<Option Name="TransportPathDelay" Val="0"/>
|
||||||
|
<Option Name="TransportIntDelay" Val="0"/>
|
||||||
|
<Option Name="SelectedSimModel" Val="rtl"/>
|
||||||
|
<Option Name="PamDesignTestbench" Val=""/>
|
||||||
|
<Option Name="PamDutBypassFile" Val="xil_dut_bypass"/>
|
||||||
|
<Option Name="PamSignalDriverFile" Val="xil_bypass_driver"/>
|
||||||
|
<Option Name="PamPseudoTop" Val="pseudo_tb"/>
|
||||||
|
<Option Name="SrcSet" Val="sources_1"/>
|
||||||
|
<Option Name="XSimWcfgFile" Val="$PPRDIR/verification/waveform_configs/rom_sd_waveform.wcfg"/>
|
||||||
|
<Option Name="CosimPdi" Val=""/>
|
||||||
|
<Option Name="CosimPlatform" Val=""/>
|
||||||
|
<Option Name="CosimElf" Val=""/>
|
||||||
|
<Option Name="xsim.simulate.runtime" Val="1s"/>
|
||||||
|
</Config>
|
||||||
|
</FileSet>
|
||||||
|
<FileSet Name="pwm_tb" Type="SimulationSrcs" RelSrcDir="$PSRCDIR/pwm_tb" RelGenDir="$PGENDIR/pwm_tb">
|
||||||
|
<Filter Type="Srcs"/>
|
||||||
|
<File Path="$PPRDIR/verification/audio/pwm_tb.sv">
|
||||||
|
<FileInfo>
|
||||||
|
<Attr Name="UsedIn" Val="synthesis"/>
|
||||||
|
<Attr Name="UsedIn" Val="implementation"/>
|
||||||
|
<Attr Name="UsedIn" Val="simulation"/>
|
||||||
|
</FileInfo>
|
||||||
|
</File>
|
||||||
|
<Config>
|
||||||
|
<Option Name="DesignMode" Val="RTL"/>
|
||||||
|
<Option Name="TopModule" Val="pwm_tb"/>
|
||||||
|
<Option Name="TopLib" Val="xil_defaultlib"/>
|
||||||
|
<Option Name="TransportPathDelay" Val="0"/>
|
||||||
|
<Option Name="TransportIntDelay" Val="0"/>
|
||||||
|
<Option Name="SelectedSimModel" Val="rtl"/>
|
||||||
|
<Option Name="PamDesignTestbench" Val=""/>
|
||||||
|
<Option Name="PamDutBypassFile" Val="xil_dut_bypass"/>
|
||||||
|
<Option Name="PamSignalDriverFile" Val="xil_bypass_driver"/>
|
||||||
|
<Option Name="PamPseudoTop" Val="pseudo_tb"/>
|
||||||
|
<Option Name="SrcSet" Val="sources_1"/>
|
||||||
|
<Option Name="CosimPdi" Val=""/>
|
||||||
|
<Option Name="CosimPlatform" Val=""/>
|
||||||
|
<Option Name="CosimElf" Val=""/>
|
||||||
|
<Option Name="xsim.simulate.runtime" Val="1s"/>
|
||||||
|
</Config>
|
||||||
|
</FileSet>
|
||||||
</FileSets>
|
</FileSets>
|
||||||
<Simulators>
|
<Simulators>
|
||||||
<Simulator Name="XSim">
|
<Simulator Name="XSim">
|
||||||
@ -345,9 +449,7 @@
|
|||||||
<Runs Version="1" Minor="22">
|
<Runs Version="1" Minor="22">
|
||||||
<Run Id="synth_1" Type="Ft3:Synth" SrcSet="sources_1" Part="xc7a100tcsg324-1" ConstrsSet="constrs_1" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="true" IncrementalCheckpoint="$PSRCDIR/utils_1/imports/synth_1/nexys_a7_top.dcp" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/synth_1" ParallelReportGen="true">
|
<Run Id="synth_1" Type="Ft3:Synth" SrcSet="sources_1" Part="xc7a100tcsg324-1" ConstrsSet="constrs_1" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="true" IncrementalCheckpoint="$PSRCDIR/utils_1/imports/synth_1/nexys_a7_top.dcp" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/synth_1" ParallelReportGen="true">
|
||||||
<Strategy Version="1" Minor="2">
|
<Strategy Version="1" Minor="2">
|
||||||
<StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2024">
|
<StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2024"/>
|
||||||
<Desc>Vivado Synthesis Defaults</Desc>
|
|
||||||
</StratHandle>
|
|
||||||
<Step Id="synth_design"/>
|
<Step Id="synth_design"/>
|
||||||
</Strategy>
|
</Strategy>
|
||||||
<GeneratedRun Dir="$PRUNDIR" File="gen_run.xml"/>
|
<GeneratedRun Dir="$PRUNDIR" File="gen_run.xml"/>
|
||||||
@ -357,9 +459,7 @@
|
|||||||
</Run>
|
</Run>
|
||||||
<Run Id="impl_1" Type="Ft2:EntireDesign" Part="xc7a100tcsg324-1" ConstrsSet="constrs_1" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/impl_1" SynthRun="synth_1" IncludeInArchive="true" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/impl_1" LaunchOptions="-jobs 2 " AutoRQSDir="$PSRCDIR/utils_1/imports/impl_1" ParallelReportGen="true">
|
<Run Id="impl_1" Type="Ft2:EntireDesign" Part="xc7a100tcsg324-1" ConstrsSet="constrs_1" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/impl_1" SynthRun="synth_1" IncludeInArchive="true" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/impl_1" LaunchOptions="-jobs 2 " AutoRQSDir="$PSRCDIR/utils_1/imports/impl_1" ParallelReportGen="true">
|
||||||
<Strategy Version="1" Minor="2">
|
<Strategy Version="1" Minor="2">
|
||||||
<StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2024">
|
<StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2024"/>
|
||||||
<Desc>Default settings for Implementation.</Desc>
|
|
||||||
</StratHandle>
|
|
||||||
<Step Id="init_design"/>
|
<Step Id="init_design"/>
|
||||||
<Step Id="opt_design"/>
|
<Step Id="opt_design"/>
|
||||||
<Step Id="power_opt_design"/>
|
<Step Id="power_opt_design"/>
|
||||||
@ -633,6 +733,135 @@
|
|||||||
<Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/>
|
<Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/>
|
||||||
<RQSFiles/>
|
<RQSFiles/>
|
||||||
</Run>
|
</Run>
|
||||||
|
<Run Id="impl_1_copy_3" Type="Ft2:EntireDesign" Part="xc7a100tcsg324-1" ConstrsSet="constrs_1" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" SynthRun="synth_1" IncludeInArchive="true" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/impl_1/impl_1_copy_3" AutoRQSDir="$PSRCDIR/utils_1/imports/impl_1/impl_1_copy_3" ParallelReportGen="true">
|
||||||
|
<Strategy Version="1" Minor="2">
|
||||||
|
<StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2024"/>
|
||||||
|
<Step Id="init_design"/>
|
||||||
|
<Step Id="opt_design"/>
|
||||||
|
<Step Id="power_opt_design"/>
|
||||||
|
<Step Id="place_design"/>
|
||||||
|
<Step Id="post_place_power_opt_design"/>
|
||||||
|
<Step Id="phys_opt_design"/>
|
||||||
|
<Step Id="route_design"/>
|
||||||
|
<Step Id="post_route_phys_opt_design"/>
|
||||||
|
<Step Id="write_bitstream"/>
|
||||||
|
</Strategy>
|
||||||
|
<ReportStrategy Name="Vivado Implementation Default Reports" Flow="Vivado Implementation 2024" CtrlBit="true">
|
||||||
|
<ReportConfig DisplayName="Timing Summary - Design Initialization" Name="impl_1_copy_3_init_report_timing_summary_0" Spec="report_timing_summary" RunStep="init_design" ReportFile="nexys_a7_top_timing_summary_init_1.rpt" Version="1" Minor="0" IsDisabled="true">
|
||||||
|
<ReportConfigOption Name="max_paths" Type="" Value="10"/>
|
||||||
|
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="DRC - Opt Design" Name="impl_1_copy_3_opt_report_drc_0" Spec="report_drc" RunStep="opt_design" ReportFile="nexys_a7_top_drc_opted_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Timing Summary - Opt Design" Name="impl_1_copy_3_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="opt_design" ReportFile="nexys_a7_top_timing_summary_opted_1.rpt" Version="1" Minor="0" IsDisabled="true">
|
||||||
|
<ReportConfigOption Name="max_paths" Type="" Value="10"/>
|
||||||
|
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Timing Summary - Power Opt Design" Name="impl_1_copy_3_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="power_opt_design" ReportFile="nexys_a7_top_timing_summary_pwropted_1.rpt" Version="1" Minor="0" IsDisabled="true">
|
||||||
|
<ReportConfigOption Name="max_paths" Type="" Value="10"/>
|
||||||
|
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="IO - Place Design" Name="impl_1_copy_3_place_report_io_0" Spec="report_io" RunStep="place_design" ReportFile="nexys_a7_top_io_placed_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Utilization - Place Design" Name="impl_1_copy_3_place_report_utilization_0" Spec="report_utilization" RunStep="place_design" ReportFile="nexys_a7_top_utilization_placed_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Control Sets - Place Design" Name="impl_1_copy_3_place_report_control_sets_0" Spec="report_control_sets" RunStep="place_design" ReportFile="nexys_a7_top_control_sets_placed_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="verbose" Type="" Value="true"/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_3_place_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_pre_placed.rpt_1.rpt" Version="1" Minor="0" IsDisabled="true">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_3_place_report_incremental_reuse_1" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_placed_1.rpt" Version="1" Minor="0" IsDisabled="true">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Timing Summary - Place Design" Name="impl_1_copy_3_place_report_timing_summary_0" Spec="report_timing_summary" RunStep="place_design" ReportFile="nexys_a7_top_timing_summary_placed_1.rpt" Version="1" Minor="0" IsDisabled="true">
|
||||||
|
<ReportConfigOption Name="max_paths" Type="" Value="10"/>
|
||||||
|
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Timing Summary - Post-Place Power Opt Design" Name="impl_1_copy_3_post_place_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_place_power_opt_design" ReportFile="nexys_a7_top_timing_summary_postplace_pwropted_1.rpt" Version="1" Minor="0" IsDisabled="true">
|
||||||
|
<ReportConfigOption Name="max_paths" Type="" Value="10"/>
|
||||||
|
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Timing Summary - Post-Place Phys Opt Design" Name="impl_1_copy_3_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="phys_opt_design" ReportFile="nexys_a7_top_timing_summary_physopted_1.rpt" Version="1" Minor="0" IsDisabled="true">
|
||||||
|
<ReportConfigOption Name="max_paths" Type="" Value="10"/>
|
||||||
|
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="implementation_log" Name="impl_1_copy_3_route_implementation_log_0" Spec="" RunStep="route_design" ReportFile="nexys_a7_top.vdi">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="DRC - Route Design" Name="impl_1_copy_3_route_report_drc_0" Spec="report_drc" RunStep="route_design" ReportFile="nexys_a7_top_drc_routed_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Methodology - Route Design" Name="impl_1_copy_3_route_report_methodology_0" Spec="report_methodology" RunStep="route_design" ReportFile="nexys_a7_top_methodology_drc_routed_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Power - Route Design" Name="impl_1_copy_3_route_report_power_0" Spec="report_power" RunStep="route_design" ReportFile="nexys_a7_top_power_routed_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Route Status - Route Design" Name="impl_1_copy_3_route_report_route_status_0" Spec="report_route_status" RunStep="route_design" ReportFile="nexys_a7_top_route_status_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Timing Summary - Route Design" Name="impl_1_copy_3_route_report_timing_summary_0" Spec="report_timing_summary" RunStep="route_design" ReportFile="nexys_a7_top_timing_summary_routed_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="max_paths" Type="" Value="10"/>
|
||||||
|
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Incremental Reuse - Route Design" Name="impl_1_copy_3_route_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="route_design" ReportFile="nexys_a7_top_incremental_reuse_routed_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Clock Utilization - Route Design" Name="impl_1_copy_3_route_report_clock_utilization_0" Spec="report_clock_utilization" RunStep="route_design" ReportFile="nexys_a7_top_clock_utilization_routed_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Bus Skew - Route Design" Name="impl_1_copy_3_route_report_bus_skew_0" Spec="report_bus_skew" RunStep="route_design" ReportFile="nexys_a7_top_bus_skew_routed_1.rpt" Version="1" Minor="1">
|
||||||
|
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Timing Summary - Post-Route Phys Opt Design" Name="impl_1_copy_3_post_route_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_timing_summary_postroute_physopted_1.rpt" Version="1" Minor="0">
|
||||||
|
<ReportConfigOption Name="max_paths" Type="" Value="10"/>
|
||||||
|
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
|
||||||
|
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="Bus Skew - Post-Route Phys Opt Design" Name="impl_1_copy_3_post_route_phys_opt_report_bus_skew_0" Spec="report_bus_skew" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_bus_skew_postroute_physopted_1.rpt" Version="1" Minor="1">
|
||||||
|
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
|
||||||
|
<ReportConfigOutputOption Name="pb" Type="string" Value=""/>
|
||||||
|
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
|
||||||
|
</ReportConfig>
|
||||||
|
<ReportConfig DisplayName="implementation_log" Name="impl_1_copy_3_bitstream_implementation_log_0" Spec="" RunStep="write_bitstream" ReportFile="nexys_a7_top.vdi">
|
||||||
|
<ReportConfigOption Name="dummy_option" Type="string"/>
|
||||||
|
</ReportConfig>
|
||||||
|
</ReportStrategy>
|
||||||
|
<Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/>
|
||||||
|
<RQSFiles/>
|
||||||
|
</Run>
|
||||||
</Runs>
|
</Runs>
|
||||||
<Board/>
|
<Board/>
|
||||||
<DashboardSummary Version="1" Minor="0">
|
<DashboardSummary Version="1" Minor="0">
|
||||||
|
|||||||
@ -31,11 +31,6 @@ module audio_buffer(
|
|||||||
// Inputs for the memory buffer
|
// Inputs for the memory buffer
|
||||||
audio_buffer_interface.receiver driver
|
audio_buffer_interface.receiver driver
|
||||||
);
|
);
|
||||||
|
|
||||||
// Whether the current address being read from is in the upper or lower
|
|
||||||
// half of the 2KiB buffer
|
|
||||||
let address_half = driver.address_half;
|
|
||||||
|
|
||||||
logic [9:0] address;
|
logic [9:0] address;
|
||||||
|
|
||||||
// State register
|
// State register
|
||||||
@ -45,8 +40,11 @@ logic [15:0] doutb;
|
|||||||
// A single bit counter, to avoid feeding samples given the 1 cycle read delay
|
// A single bit counter, to avoid feeding samples given the 1 cycle read delay
|
||||||
logic delay;
|
logic delay;
|
||||||
|
|
||||||
|
// Whether the current address being read from is in the upper or lower
|
||||||
|
// half of the 2KiB buffer
|
||||||
|
//
|
||||||
// The MSB of the address == higher/lower half address
|
// The MSB of the address == higher/lower half address
|
||||||
assign address_half = address[9];
|
assign driver.address_half = address[9];
|
||||||
|
|
||||||
always_ff @(posedge clk) begin
|
always_ff @(posedge clk) begin
|
||||||
enb <= 0;
|
enb <= 0;
|
||||||
@ -143,12 +141,18 @@ buffer (
|
|||||||
.rstb(reset), // 1-bit input: Reset signal for the final port B output register stage.
|
.rstb(reset), // 1-bit input: Reset signal for the final port B output register stage.
|
||||||
// Synchronously resets output port doutb to the value specified by
|
// Synchronously resets output port doutb to the value specified by
|
||||||
// parameter READ_RESET_VALUE_B.
|
// parameter READ_RESET_VALUE_B.
|
||||||
.wea(driver.ena) // WRITE_DATA_WIDTH_A/BYTE_WRITE_WIDTH_A-bit input: Write enable vector
|
.wea(driver.ena), // WRITE_DATA_WIDTH_A/BYTE_WRITE_WIDTH_A-bit input: Write enable vector
|
||||||
// for port A input data port dina. 1 bit wide when word-wide writes are
|
// for port A input data port dina. 1 bit wide when word-wide writes are
|
||||||
// used. In byte-wide write configurations, each bit controls the
|
// used. In byte-wide write configurations, each bit controls the
|
||||||
// writing one byte of dina to address addra. For example, to
|
// writing one byte of dina to address addra. For example, to
|
||||||
// synchronously write only bits [15-8] of dina when WRITE_DATA_WIDTH_A
|
// synchronously write only bits [15-8] of dina when WRITE_DATA_WIDTH_A
|
||||||
// is 32, wea would be 4'b0010.
|
// is 32, wea would be 4'b0010.
|
||||||
|
// Extra inputs that I guess I need
|
||||||
|
.sleep(0),
|
||||||
|
.injectsbiterra(0),
|
||||||
|
.injectdbiterra(0),
|
||||||
|
// With a latency of 1 this surely does not matter
|
||||||
|
.regceb(enb)
|
||||||
);
|
);
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|||||||
@ -16,8 +16,11 @@ module pwm(
|
|||||||
// The audio output pin
|
// The audio output pin
|
||||||
output wire pwm_pin
|
output wire pwm_pin
|
||||||
);
|
);
|
||||||
|
// This can't be 16 or we are slowing the audio rate down by a factor of
|
||||||
|
// 2^5=32
|
||||||
|
parameter DEPTH=8;
|
||||||
|
|
||||||
logic [15:0] pulse_counter;
|
logic [DEPTH-1:0] pulse_counter;
|
||||||
logic [15:0] sample_buffer;
|
logic [15:0] sample_buffer;
|
||||||
logic should_output;
|
logic should_output;
|
||||||
|
|
||||||
@ -27,6 +30,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
pulse_counter <= 0;
|
pulse_counter <= 0;
|
||||||
sample_buffer <= 0;
|
sample_buffer <= 0;
|
||||||
|
should_output <= 0;
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -36,7 +40,7 @@ begin
|
|||||||
|
|
||||||
pulse_counter <= pulse_counter + 1;
|
pulse_counter <= pulse_counter + 1;
|
||||||
|
|
||||||
if (pulse_counter < sample_buffer)
|
if (pulse_counter < sample_buffer[15-:DEPTH])
|
||||||
should_output <= 1;
|
should_output <= 1;
|
||||||
else
|
else
|
||||||
should_output <= 0;
|
should_output <= 0;
|
||||||
|
|||||||
22
design/modular_clock_gen.sv
Normal file
22
design/modular_clock_gen.sv
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
module modular_clock_gen(
|
||||||
|
input clk, reset,
|
||||||
|
output oclk
|
||||||
|
);
|
||||||
|
parameter DIVISOR;
|
||||||
|
|
||||||
|
logic [$clog2(DIVISOR)-1:0] counter;
|
||||||
|
|
||||||
|
// clock will be high for about half of the cycle, depending on integer
|
||||||
|
// rounding
|
||||||
|
assign oclk = counter < (DIVISOR/2);
|
||||||
|
|
||||||
|
always_ff @(posedge clk) begin
|
||||||
|
if (reset)
|
||||||
|
counter <= DIVISOR-1;
|
||||||
|
else if (counter == 0)
|
||||||
|
counter <= DIVISOR-1;
|
||||||
|
else
|
||||||
|
counter <= counter - 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
@ -12,8 +12,10 @@ import sdvd_defs::SPEED;
|
|||||||
module nexys_a7_top(
|
module nexys_a7_top(
|
||||||
input logic CLK100MHZ, CPU_RESETN,
|
input logic CLK100MHZ, CPU_RESETN,
|
||||||
input logic BTNC, BTNR,
|
input logic BTNC, BTNR,
|
||||||
|
output logic AUD_PWM, AUD_SD,
|
||||||
output logic CA,CB,CC,CD,CE,CF,CG,
|
output logic CA,CB,CC,CD,CE,CF,CG,
|
||||||
output logic [7:0] AN
|
output logic [7:0] AN,
|
||||||
|
output wire LED[0:0]
|
||||||
);
|
);
|
||||||
|
|
||||||
// Active high reset
|
// Active high reset
|
||||||
@ -21,10 +23,13 @@ wire reset;
|
|||||||
assign reset = ~CPU_RESETN;
|
assign reset = ~CPU_RESETN;
|
||||||
|
|
||||||
logic clk_1khz, clk_10hz;
|
logic clk_1khz, clk_10hz;
|
||||||
|
logic clk_48khz, clk_1mhz;
|
||||||
logic seconds_pulse;
|
logic seconds_pulse;
|
||||||
|
|
||||||
SPEED speed;
|
SPEED speed;
|
||||||
|
|
||||||
|
audio_buffer_interface audio_interface();
|
||||||
|
|
||||||
// Map C{A-G} to an array of 7-segment displays
|
// Map C{A-G} to an array of 7-segment displays
|
||||||
wire [6:0] segments [7:0];
|
wire [6:0] segments [7:0];
|
||||||
wire [2:0] segment_mux_select;
|
wire [2:0] segment_mux_select;
|
||||||
@ -32,18 +37,31 @@ wire [2:0] segment_mux_select;
|
|||||||
// These segments are currently unused
|
// These segments are currently unused
|
||||||
assign segments[7] = 0;
|
assign segments[7] = 0;
|
||||||
assign segments[6] = 0;
|
assign segments[6] = 0;
|
||||||
|
// These are the ones we're using
|
||||||
assign {CA,CB,CC,CD,CE,CF,CG} = ~segments[segment_mux_select];
|
assign {CA,CB,CC,CD,CE,CF,CG} = ~segments[segment_mux_select];
|
||||||
|
|
||||||
logic [$clog2(60)-1:0] seconds;
|
logic [$clog2(60)-1:0] seconds;
|
||||||
logic [$clog2(60)-1:0] minutes;
|
logic [$clog2(60)-1:0] minutes;
|
||||||
logic [$clog2(60)-1:0] hours;
|
logic [$clog2(60)-1:0] hours;
|
||||||
|
|
||||||
|
logic [15:0] audio_sample;
|
||||||
|
logic sd_ready;
|
||||||
|
logic playing;
|
||||||
|
|
||||||
|
assign LED[0] = playing;
|
||||||
|
assign AUD_SD = playing;
|
||||||
|
|
||||||
low_freq_clock_gen clockGen(CLK100MHZ, reset, speed, clk_1khz, clk_10hz, seconds_pulse);
|
low_freq_clock_gen clockGen(CLK100MHZ, reset, speed, clk_1khz, clk_10hz, seconds_pulse);
|
||||||
|
|
||||||
|
// Create a clock with a divisor of 2083, making ~48khz
|
||||||
|
modular_clock_gen #(2083) audioClock(CLK100MHZ, reset, clk_48khz);
|
||||||
|
modular_clock_gen #(100) pwmClock(CLK100MHZ, reset, clk_1mhz);
|
||||||
|
|
||||||
|
|
||||||
// Count the number on seconds, hours, and minutes elapsed
|
// Count the number on seconds, hours, and minutes elapsed
|
||||||
// If the speed is faster this will pulse more often than once a second
|
// If the speed is faster this will pulse more often than once a second
|
||||||
// but will still theoretically be a second of video time
|
// but will still theoretically be a second of video time
|
||||||
always_ff @(posedge seconds_pulse) begin
|
always_ff @(posedge seconds_pulse or posedge reset) begin
|
||||||
if (reset) begin
|
if (reset) begin
|
||||||
seconds <= 0;
|
seconds <= 0;
|
||||||
minutes <= 0;
|
minutes <= 0;
|
||||||
@ -72,8 +90,19 @@ seconds_display hoursSegment (hours, segments[5], segments[4]);
|
|||||||
// Gets rid of button bouncing
|
// Gets rid of button bouncing
|
||||||
playback_controller playbackController (clk_10hz,reset,BTNC, BTNR, speed);
|
playback_controller playbackController (clk_10hz,reset,BTNC, BTNR, speed);
|
||||||
|
|
||||||
|
pwm audioOutput(CLK100MHZ, reset, clk_48khz, audio_sample, AUD_PWM);
|
||||||
|
audio_buffer audioBuffer(
|
||||||
|
clk_48khz,
|
||||||
|
reset,
|
||||||
|
sd_ready,
|
||||||
|
'0, // stop signal not used right now
|
||||||
|
speed,
|
||||||
|
playing,
|
||||||
|
audio_sample,
|
||||||
|
audio_interface.receiver
|
||||||
|
);
|
||||||
|
|
||||||
|
rom_sd romSdPlayer(clk_1mhz,reset,sd_ready,audio_interface.driver);
|
||||||
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|||||||
@ -10,17 +10,17 @@ module rom_sd(
|
|||||||
input logic reset,
|
input logic reset,
|
||||||
output logic ready,
|
output logic ready,
|
||||||
|
|
||||||
buffer_interface.driver buffer
|
audio_buffer_interface.driver buffer
|
||||||
);
|
);
|
||||||
|
parameter MEM_FILE = "roundabout.mem";
|
||||||
|
|
||||||
typedef enum logic [2:0]{
|
typedef enum logic [3:0]{
|
||||||
RESET, DELAY, WRITEBUF, ENDWRITE, WAIT
|
RESET, DELAY1, DELAY2, DELAY3, WRITEBUF, ENDWRITE1, ENDWRITE2, ENDWRITE3, WAIT
|
||||||
} state_t;
|
} state_t;
|
||||||
|
|
||||||
state_t current, next;
|
state_t current, next;
|
||||||
// First we write 2048B into the memory buffer, then signal to play it and
|
// First we write 2048B into the memory buffer, then signal to play it and
|
||||||
// wait for half signal to avoid overwriting memory
|
// wait for half signal to avoid overwriting memory
|
||||||
logic initializing;
|
|
||||||
logic [16:0] rom_addr;
|
logic [16:0] rom_addr;
|
||||||
logic [7:0] rom_data;
|
logic [7:0] rom_data;
|
||||||
logic rom_enable;
|
logic rom_enable;
|
||||||
@ -40,8 +40,8 @@ xpm_memory_sprom #(
|
|||||||
.ECC_MODE("no_ecc"), // String
|
.ECC_MODE("no_ecc"), // String
|
||||||
.ECC_TYPE("none"), // String
|
.ECC_TYPE("none"), // String
|
||||||
.IGNORE_INIT_SYNTH(0), // DECIMAL
|
.IGNORE_INIT_SYNTH(0), // DECIMAL
|
||||||
.MEMORY_INIT_FILE("roundabout.mem"), // String
|
.MEMORY_INIT_FILE(MEM_FILE), // String
|
||||||
.MEMORY_INIT_PARAM("0"), // String
|
.MEMORY_INIT_PARAM(""), // String
|
||||||
.MEMORY_OPTIMIZATION("true"), // String
|
.MEMORY_OPTIMIZATION("true"), // String
|
||||||
.MEMORY_PRIMITIVE("auto"), // String
|
.MEMORY_PRIMITIVE("auto"), // String
|
||||||
.MEMORY_SIZE(131072*8), // DECIMAL
|
.MEMORY_SIZE(131072*8), // DECIMAL
|
||||||
@ -63,46 +63,67 @@ xpm_memory_sprom_inst (
|
|||||||
.ena(rom_enable), // 1-bit input: Memory enable signal for port A. Must be high on clock
|
.ena(rom_enable), // 1-bit input: Memory enable signal for port A. Must be high on clock
|
||||||
// cycles when read operations are initiated. Pipelined internally.
|
// cycles when read operations are initiated. Pipelined internally.
|
||||||
|
|
||||||
.rsta(reset) // 1-bit input: Reset signal for the final port A output register stage.
|
.rsta(reset), // 1-bit input: Reset signal for the final port A output register stage.
|
||||||
// Synchronously resets output port douta to the value specified by
|
// Synchronously resets output port douta to the value specified by
|
||||||
// parameter READ_RESET_VALUE_A.
|
// parameter READ_RESET_VALUE_A.
|
||||||
|
|
||||||
|
// These are required I think? The ROM gets optimized out without them
|
||||||
|
.sleep(0),
|
||||||
|
// Should this have a separate control signal? What happens if it gets
|
||||||
|
// turned on early like I'm doing now?
|
||||||
|
.regcea(rom_enable),
|
||||||
|
.injectsbiterra(0),
|
||||||
|
.injectdbiterra(0)
|
||||||
);
|
);
|
||||||
// End of xpm_memory_sprom_inst instantiation
|
// End of xpm_memory_sprom_inst instantiation
|
||||||
|
|
||||||
|
assign buffer_half = buffer.addra[10];
|
||||||
|
// The audio buffer memory is clocked at the same speed as this module
|
||||||
|
assign buffer.clka = clk;
|
||||||
|
|
||||||
//next state logic
|
//next state logic
|
||||||
always_comb
|
always_comb
|
||||||
begin
|
begin
|
||||||
case (current)
|
case (current)
|
||||||
RESET: if (reset) next = RESET;
|
RESET: if (reset) next = RESET;
|
||||||
else next = DELAY;
|
else next = DELAY1;
|
||||||
|
DELAY1: next = DELAY2;
|
||||||
|
DELAY2: next = DELAY3;
|
||||||
|
DELAY3: next = WRITEBUF;
|
||||||
|
|
||||||
DELAY: next = WRITEBUF;
|
WRITEBUF: if (buffer.addra[9:0] < 1020) next = WRITEBUF;
|
||||||
|
else next = ENDWRITE1;
|
||||||
|
|
||||||
WRITEBUF: if (buffer.addra < 1023) next = WRITEBUF;
|
ENDWRITE1: next = ENDWRITE2;
|
||||||
else if (buffer.addra == 1023) next = ENDWRITE;
|
ENDWRITE2: next = ENDWRITE3;
|
||||||
|
ENDWRITE3: next = WAIT;
|
||||||
ENDWRITE: next = WAIT;
|
|
||||||
|
|
||||||
WAIT: if (buffer_half == buffer.address_half) next = WAIT;
|
WAIT: if (buffer_half == buffer.address_half) next = WAIT;
|
||||||
else next = DELAY;
|
else next = DELAY1;
|
||||||
|
|
||||||
default: next = RESET;
|
default: next = RESET;
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
|
||||||
//sequential output logic
|
//sequential output logic
|
||||||
always_ff @(posedge clock)
|
always_ff @(posedge clk)
|
||||||
begin
|
begin
|
||||||
case (current)
|
case (current)
|
||||||
RESET: begin
|
RESET: begin
|
||||||
buffer_half <= 0;
|
|
||||||
rom_addr <= 0;
|
rom_addr <= 0;
|
||||||
rom_enable <= 1;
|
rom_enable <= 1;
|
||||||
buffer.addra <= 0;
|
buffer.addra <= 0;
|
||||||
|
buffer.ena <= 0;
|
||||||
ready <= 0;
|
ready <= 0;
|
||||||
end
|
end
|
||||||
|
|
||||||
DELAY: rom_addr <= rom_addr + 1;
|
DELAY1: rom_addr <= rom_addr + 1;
|
||||||
|
DELAY2: rom_addr <= rom_addr + 1;
|
||||||
|
DELAY3: begin
|
||||||
|
rom_addr <= rom_addr + 1;
|
||||||
|
buffer.dina <= rom_data;
|
||||||
|
buffer.ena <= 1;
|
||||||
|
end
|
||||||
|
|
||||||
WRITEBUF: begin
|
WRITEBUF: begin
|
||||||
buffer.ena <= 1;
|
buffer.ena <= 1;
|
||||||
@ -110,29 +131,37 @@ begin
|
|||||||
buffer.addra <= buffer.addra + 1;
|
buffer.addra <= buffer.addra + 1;
|
||||||
rom_addr <= rom_addr + 1;
|
rom_addr <= rom_addr + 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
ENDWRITE: begin
|
ENDWRITE1, ENDWRITE2:
|
||||||
|
begin
|
||||||
buffer.ena <= 1;
|
buffer.ena <= 1;
|
||||||
buffer.data <= rom_data;
|
buffer.dina <= rom_data;
|
||||||
|
buffer.addra <= buffer.addra + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
ENDWRITE3: begin
|
||||||
|
buffer.ena <= 0;
|
||||||
|
buffer.dina <= rom_data;
|
||||||
buffer.addra <= buffer.addra + 1;
|
buffer.addra <= buffer.addra + 1;
|
||||||
ready <= 1;
|
ready <= 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
WAIT: buffer.ena <= 0;
|
WAIT: ;
|
||||||
|
|
||||||
default: begin
|
default: begin
|
||||||
buffer_half <= 0;
|
|
||||||
rom_addr <= 0;
|
rom_addr <= 0;
|
||||||
rom_enable <= 0;
|
rom_enable <= 0;
|
||||||
buffer.addra <= 0;
|
buffer.addra <= 0;
|
||||||
buffer.dina <= 0;
|
buffer.dina <= 0;
|
||||||
|
buffer.ena <= 0;
|
||||||
ready <= 0;
|
ready <= 0;
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
|
||||||
//sequential clocking block
|
//sequential clocking block
|
||||||
always_ff @(posedge clock)
|
always_ff @(posedge clk)
|
||||||
begin
|
begin
|
||||||
if (reset)
|
if (reset)
|
||||||
current <= RESET;
|
current <= RESET;
|
||||||
|
|||||||
14
doc/bugs.md
14
doc/bugs.md
@ -12,3 +12,17 @@
|
|||||||
|
|
||||||
### Low Freq Clock Gen
|
### Low Freq Clock Gen
|
||||||
- Was initially trying to do modulo at max clock speed, failing timing
|
- Was initially trying to do modulo at max clock speed, failing timing
|
||||||
|
|
||||||
|
|
||||||
|
### sd_rom
|
||||||
|
- ROM was getting totally optimized out and was doing nothing in simulation, and
|
||||||
|
didn't show up in synthesized design
|
||||||
|
- Timing issues, ROM was one cycle slower than expected, latching takes an extra
|
||||||
|
cycle too, had to rework state machines, there are a bonus 2 delay states when
|
||||||
|
starting and ending writes
|
||||||
|
|
||||||
|
### PWM
|
||||||
|
- major design problems
|
||||||
|
- clocked too slow
|
||||||
|
- initial goal of 16-bit audio isn't feasible because 100MHz isn't fast enough
|
||||||
|
to pwm based on a 16-bit counter, would give a sample rate of 1.5khz
|
||||||
|
|||||||
2815
roms/consecutive.mem
Normal file
2815
roms/consecutive.mem
Normal file
File diff suppressed because it is too large
Load Diff
192000
roms/even_flow.mem
Normal file
192000
roms/even_flow.mem
Normal file
File diff suppressed because it is too large
Load Diff
1
roms/even_flow.raw
Normal file
1
roms/even_flow.raw
Normal file
File diff suppressed because one or more lines are too long
5
roms/gen_consecutive.py
Normal file
5
roms/gen_consecutive.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
for i in range(1,256):
|
||||||
|
print(hex(i))
|
||||||
|
for i in range(0,10):
|
||||||
|
for i in range(0,256):
|
||||||
|
print(hex(i))
|
||||||
96000
roms/testfile.mem
Normal file
96000
roms/testfile.mem
Normal file
File diff suppressed because it is too large
Load Diff
96000
roms/testfile_explicit_addr.mem
Normal file
96000
roms/testfile_explicit_addr.mem
Normal file
File diff suppressed because it is too large
Load Diff
57
verification/audio/pwm_tb.sv
Normal file
57
verification/audio/pwm_tb.sv
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*****
|
||||||
|
* pwm_tb.sv - testbench for the pwm.sv module.
|
||||||
|
*
|
||||||
|
* @author: Dilanthi Prentice, Waylon Cude
|
||||||
|
* @date: 6/12/2025
|
||||||
|
* */
|
||||||
|
|
||||||
|
module pwm_tb;
|
||||||
|
bit clk, reset;
|
||||||
|
|
||||||
|
logic load;
|
||||||
|
wire pwm_pin;
|
||||||
|
logic [15:0] sample;
|
||||||
|
|
||||||
|
pwm dut (.*);
|
||||||
|
|
||||||
|
initial forever #10 clk = ~clk;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
reset = 1;
|
||||||
|
@(posedge clk);
|
||||||
|
@(posedge clk);
|
||||||
|
reset = 0;
|
||||||
|
load = 1;
|
||||||
|
sample = 0;
|
||||||
|
for (int i=0; i < (1<<16)-1; i++) begin
|
||||||
|
@(posedge clk) assert (pwm_pin === 0)
|
||||||
|
else $error("Should be low at %d",i);
|
||||||
|
end
|
||||||
|
reset = 0;
|
||||||
|
load = 1;
|
||||||
|
sample = '1;
|
||||||
|
@(posedge clk)
|
||||||
|
for (int i=0; i < (1<<16)-1; i++) begin
|
||||||
|
@(posedge clk) assert (pwm_pin === 'z)
|
||||||
|
else $error("Should be high at %d",i);
|
||||||
|
end
|
||||||
|
|
||||||
|
reset = 0;
|
||||||
|
load = 1;
|
||||||
|
// Should be about half on
|
||||||
|
sample = 1<<15;
|
||||||
|
@(posedge clk)
|
||||||
|
for (int i=0; i < (1<<15); i++) begin
|
||||||
|
@(posedge clk) assert (pwm_pin === 'z)
|
||||||
|
else $error("Should be high at %d",i);
|
||||||
|
end
|
||||||
|
sample = 1<<15;
|
||||||
|
for (int i = (1 << 15); i < (1<<16)-1; i++) begin
|
||||||
|
@(posedge clk) assert (pwm_pin === 0)
|
||||||
|
else $error("Should be low at %d",i);
|
||||||
|
end
|
||||||
|
$finish;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
@ -1,6 +0,0 @@
|
|||||||
/*****
|
|
||||||
* pwn_tb.sv - testbench for the pwn.sv module.
|
|
||||||
*
|
|
||||||
* @author: Dilanthi Prentice, Waylon Cude
|
|
||||||
* @date: 6/12/2025
|
|
||||||
* */
|
|
||||||
155
verification/sd/rom_sd_tb.sv
Normal file
155
verification/sd/rom_sd_tb.sv
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
`ifdef VERILATOR
|
||||||
|
`include "sdvd_defs.sv"
|
||||||
|
`endif
|
||||||
|
|
||||||
|
module rom_sd_tb;
|
||||||
|
bit clk,reset;
|
||||||
|
wire ready;
|
||||||
|
int errors;
|
||||||
|
logic [10:0] i;
|
||||||
|
|
||||||
|
audio_buffer_interface buffer();
|
||||||
|
|
||||||
|
rom_sd #("consecutive.mem") dut (clk,reset,ready,buffer.driver);
|
||||||
|
|
||||||
|
|
||||||
|
initial forever #10 clk = ~clk;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
reset = 1;
|
||||||
|
buffer.address_half = 0;
|
||||||
|
@(posedge clk);
|
||||||
|
reset = 0;
|
||||||
|
// Audio data should not be flowing yet
|
||||||
|
#1 assert (buffer.dina == 0)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Data not zero after reset, found 0x%x",buffer.dina);
|
||||||
|
end
|
||||||
|
repeat (3) @(posedge clk);
|
||||||
|
for (i = 0; i < 1024;) begin
|
||||||
|
@(posedge clk);
|
||||||
|
#1
|
||||||
|
|
||||||
|
assert (buffer.addra === i)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Incorrect address, expected %x found %x",i,buffer.addra);
|
||||||
|
end
|
||||||
|
|
||||||
|
assert (buffer.dina === ((i + 1) % 256))
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Incorrect data, expected 0x%x but found 0x%x",i[7:0],buffer.dina);
|
||||||
|
end
|
||||||
|
|
||||||
|
assert (i == 0 || buffer.ena === 1)
|
||||||
|
else begin
|
||||||
|
$error("Enable not high");
|
||||||
|
errors++;
|
||||||
|
end
|
||||||
|
|
||||||
|
assert (buffer.address_half == 0)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Incorrect address half, expected 0 but found %d",buffer.address_half);
|
||||||
|
end
|
||||||
|
|
||||||
|
i = i + 1;
|
||||||
|
end
|
||||||
|
// Wait a cycle for the buffer to catch up
|
||||||
|
@(posedge clk);
|
||||||
|
// Make sure that we start waiting and that we signal that the buffer
|
||||||
|
// is ready
|
||||||
|
#1 assert(buffer.ena === 0)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Buffer did not wait after first full cycle");
|
||||||
|
end
|
||||||
|
assert(ready === 1)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Buffer did not signal ready");
|
||||||
|
end
|
||||||
|
|
||||||
|
assert(dut.buffer_half === 1)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Buffer half did not correctly change to 1");
|
||||||
|
end
|
||||||
|
|
||||||
|
// Set the address half high so we can test waiting/catching up to the
|
||||||
|
// buffer
|
||||||
|
buffer.address_half = 1;
|
||||||
|
repeat (100) @(posedge clk);
|
||||||
|
#1 assert(buffer.ena === 0)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Buffer did not wait after first full cycle");
|
||||||
|
end
|
||||||
|
|
||||||
|
buffer.address_half = 0;
|
||||||
|
repeat (3) @(posedge clk);
|
||||||
|
// Check that sending into the upper half of the buffer works as
|
||||||
|
// expected
|
||||||
|
while (i != 0) begin
|
||||||
|
@(posedge clk);
|
||||||
|
#1
|
||||||
|
|
||||||
|
assert (buffer.addra === i)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Incorrect address, expected %x found %x",i,buffer.addra);
|
||||||
|
end
|
||||||
|
|
||||||
|
assert (buffer.dina === ((i + 1) % 256))
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Incorrect data, expected 0x%x but found 0x%x",i[7:0],buffer.dina);
|
||||||
|
end
|
||||||
|
|
||||||
|
assert (i == 0 || buffer.ena === 1)
|
||||||
|
else begin
|
||||||
|
$error("Enable not high");
|
||||||
|
errors++;
|
||||||
|
end
|
||||||
|
|
||||||
|
assert (buffer.address_half == 0)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Incorrect address half, expected 0 but found %d",buffer.address_half);
|
||||||
|
end
|
||||||
|
|
||||||
|
i = i + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
// Wait a cycle for the buffer to catch up
|
||||||
|
@(posedge clk);
|
||||||
|
// Make sure that we start waiting
|
||||||
|
#1 assert(buffer.ena === 0)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Buffer did not wait after second full cycle");
|
||||||
|
end
|
||||||
|
assert(ready === 1)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Buffer did not signal ready");
|
||||||
|
end
|
||||||
|
|
||||||
|
assert(dut.buffer_half === 0)
|
||||||
|
else begin
|
||||||
|
errors++;
|
||||||
|
$error("Buffer half did not correctly change to 0");
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
$display("Found %0d errors while testing rom_sd",errors);
|
||||||
|
|
||||||
|
$finish;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
63
verification/waveform_configs/rom_sd_waveform.wcfg
Normal file
63
verification/waveform_configs/rom_sd_waveform.wcfg
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<wave_config>
|
||||||
|
<wave_state>
|
||||||
|
</wave_state>
|
||||||
|
<db_ref_list>
|
||||||
|
<db_ref path="rom_sd_tb_behav.wdb" id="1">
|
||||||
|
<top_modules>
|
||||||
|
<top_module name="glbl" />
|
||||||
|
<top_module name="rom_sd_tb" />
|
||||||
|
</top_modules>
|
||||||
|
</db_ref>
|
||||||
|
</db_ref_list>
|
||||||
|
<zoom_setting>
|
||||||
|
<ZoomStartTime time="0.000 ns"></ZoomStartTime>
|
||||||
|
<ZoomEndTime time="143.201 ns"></ZoomEndTime>
|
||||||
|
<Cursor1Time time="0.000 ns"></Cursor1Time>
|
||||||
|
</zoom_setting>
|
||||||
|
<column_width_setting>
|
||||||
|
<NameColumnWidth column_width="453"></NameColumnWidth>
|
||||||
|
<ValueColumnWidth column_width="200"></ValueColumnWidth>
|
||||||
|
</column_width_setting>
|
||||||
|
<WVObjectSize size="10" />
|
||||||
|
<wvobject type="logic" fp_name="/rom_sd_tb/clk">
|
||||||
|
<obj_property name="ElementShortName">clk</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">clk</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/rom_sd_tb/reset">
|
||||||
|
<obj_property name="ElementShortName">reset</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">reset</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/rom_sd_tb/ready">
|
||||||
|
<obj_property name="ElementShortName">ready</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">ready</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/rom_sd_tb/dut/rom_data">
|
||||||
|
<obj_property name="ElementShortName">rom_data[7:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rom_data[7:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/rom_sd_tb/dut/current">
|
||||||
|
<obj_property name="ElementShortName">current[2:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">current[2:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/rom_sd_tb/dut/rom_addr">
|
||||||
|
<obj_property name="ElementShortName">rom_addr[16:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rom_addr[16:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/rom_sd_tb/dut/rom_enable">
|
||||||
|
<obj_property name="ElementShortName">rom_enable</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rom_enable</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/rom_sd_tb/buffer/addra">
|
||||||
|
<obj_property name="ElementShortName">addra[10:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">addra[10:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/rom_sd_tb/buffer/dina">
|
||||||
|
<obj_property name="ElementShortName">dina[7:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">dina[7:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/rom_sd_tb/buffer/ena">
|
||||||
|
<obj_property name="ElementShortName">ena</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">ena</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
</wave_config>
|
||||||
Loading…
x
Reference in New Issue
Block a user