| @@ -0,0 +1,21 @@ | ||
|
|
||
| DEFINE std $CDS_ROOT/tools/inca/files/STD/ | ||
| DEFINE synopsys $CDS_ROOT/tools/inca/files/SYNOPSYS/ | ||
| DEFINE ieee $CDS_ROOT/tools/inca/files/IEEE/ | ||
| DEFINE ambit $CDS_ROOT/tools/inca/files/AMBIT/ | ||
| DEFINE vital_memory $CDS_ROOT/tools/inca/files/VITAL_MEMORY/ | ||
| DEFINE ncutils $CDS_ROOT/tools/inca/files/NCUTILS/ | ||
| DEFINE ncinternal $CDS_ROOT/tools/inca/files/NCINTERNAL/ | ||
| DEFINE ncmodels $CDS_ROOT/tools/inca/files/NCMODELS/ | ||
| DEFINE cds_assertions $CDS_ROOT/tools/inca/files/CDS_ASSERTIONS/ | ||
| DEFINE work ./../libraries/work/ | ||
| DEFINE altera_ver ./../libraries/altera_ver/ | ||
| DEFINE lpm_ver ./../libraries/lpm_ver/ | ||
| DEFINE sgate_ver ./../libraries/sgate_ver/ | ||
| DEFINE altera_mf_ver ./../libraries/altera_mf_ver/ | ||
| DEFINE altera_lnsim_ver ./../libraries/altera_lnsim_ver/ | ||
| DEFINE cyclonev_ver ./../libraries/cyclonev_ver/ | ||
| DEFINE cyclonev_hssi_ver ./../libraries/cyclonev_hssi_ver/ | ||
| DEFINE cyclonev_pcie_hip_ver ./../libraries/cyclonev_pcie_hip_ver/ | ||
| DEFINE altera_common_sv_packages ./../libraries/altera_common_sv_packages/ | ||
| DEFINE transacto ./../libraries/transacto/ |
| @@ -0,0 +1,2 @@ | ||
|
|
||
| DEFINE WORK work |
| @@ -0,0 +1,105 @@ | ||
| set_global_assignment -entity "soc_system" -library "lib_soc_system" -name IP_TOOL_NAME "Qsys" | ||
| set_global_assignment -entity "soc_system" -library "lib_soc_system" -name IP_TOOL_VERSION "15.1" | ||
| set_global_assignment -entity "soc_system" -library "lib_soc_system" -name IP_TOOL_ENV "Qsys" | ||
| set_global_assignment -library "lib_soc_system" -name SPD_FILE [file join $::quartus(sip_path) "../soc_system.spd"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "../../soc_system.qsys"] | ||
|
|
||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "soc_system.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_reset_controller.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_reset_synchronizer.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_reset_controller.sdc"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_irq_mapper_001.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_irq_mapper.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_1.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_width_adapter.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_address_alignment.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_burst_uncompressor.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_arbitrator.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_1_rsp_mux.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_1_rsp_demux.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_1_cmd_mux.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_1_cmd_demux.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_traffic_limiter.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_reorder_memory.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_sc_fifo.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_st_pipeline_base.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_1_router_001.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_1_router.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_axi_slave_ni.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_master_agent.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_master_translator.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_avalon_st_adapter_001.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_avalon_st_adapter_001_error_adapter_0.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_avalon_st_adapter.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_avalon_st_adapter_error_adapter_0.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_rsp_mux_003.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_rsp_mux_002.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_rsp_mux.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_rsp_demux_002.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_rsp_demux_001.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_rsp_demux.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_cmd_mux_002.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_cmd_mux_001.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_cmd_mux.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_cmd_demux_003.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_cmd_demux_002.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_cmd_demux.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_burst_adapter.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_burst_adapter_uncmpr.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_burst_adapter_13_1.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_burst_adapter_new.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_incr_burst_converter.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_wrap_burst_converter.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_default_burst_converter.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_st_pipeline_stage.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_router_007.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_router_006.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_router_005.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_router_003.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_router_002.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_mm_interconnect_0_router.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_slave_agent.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_axi_master_ni.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_merlin_slave_translator.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_sysid_qsys.vo"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_onchip_memory2_0.hex"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_onchip_memory2_0.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_master_non_sec.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_master_non_sec_p2b_adapter.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_master_non_sec_b2p_adapter.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_packets_to_master.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_st_packets_to_bytes.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_st_bytes_to_packets.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_master_non_sec_timing_adt.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_st_jtag_interface.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_jtag_dc_streaming.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_jtag_sld_node.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_jtag_streaming.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_st_clock_crosser.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_std_synchronizer_nocut.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_st_idle_remover.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_st_idle_inserter.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_st_jtag_interface.sdc"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_led_pio.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_jtag_uart.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/intr_capturer.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_hps_0.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_hps_0_hps_io.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/verbosity_pkg.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/avalon_utilities_pkg.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/avalon_mm_pkg.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_mm_slave_bfm.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_interrupt_sink.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_clock_source.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/altera_avalon_reset_source.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_hps_0_hps_io_border_memory.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_hps_0_hps_io_border_hps_io.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_hps_0_hps_io_border.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/questa_mvc_svapi.svh"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/mgc_common_axi.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/mgc_axi_master.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/mgc_axi_slave.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_hps_0_fpga_interfaces.sv"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_dipsw_pio.v"] | ||
| set_global_assignment -library "lib_soc_system" -name MISC_FILE [file join $::quartus(sip_path) "submodules/soc_system_button_pio.v"] |
| @@ -0,0 +1,93 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // $File: //acds/rel/15.1/ip/sopc/components/verification/altera_avalon_clock_source/altera_avalon_clock_source.sv $ | ||
| // $Revision: #1 $ | ||
| // $Date: 2015/08/09 $ | ||
| // $Author: swbranch $ | ||
| //------------------------------------------------------------------------------ | ||
| // Clock generator | ||
|
|
||
| `timescale 1ps / 1ps | ||
|
|
||
| module altera_avalon_clock_source (clk); | ||
| output clk; | ||
|
|
||
| parameter int unsigned CLOCK_RATE = 10; // clock rate in MHz / kHz / Hz depends on the clock unit | ||
| parameter CLOCK_UNIT = 1000000; // clock unit MHz / kHz / Hz | ||
|
|
||
| // synthesis translate_off | ||
| import verbosity_pkg::*; | ||
|
|
||
| localparam time HALF_CLOCK_PERIOD = 1000000000000.000000/(CLOCK_RATE*CLOCK_UNIT*2); // half clock period in ps | ||
|
|
||
| logic clk = 1'b0; | ||
|
|
||
| string message = "*uninitialized*"; | ||
| string freq_unit = (CLOCK_UNIT == 1)? "Hz" : | ||
| (CLOCK_UNIT == 1000)? "kHz" : "MHz"; | ||
| bit run_state = 1'b1; | ||
|
|
||
| function automatic void __hello(); | ||
| $sformat(message, "%m: - Hello from altera_clock_source."); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - $Revision: #1 $"); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - $Date: 2015/08/09 $"); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - CLOCK_RATE = %0d %s", CLOCK_RATE, freq_unit); | ||
| print(VERBOSITY_INFO, message); | ||
| print_divider(VERBOSITY_INFO); | ||
| endfunction | ||
|
|
||
| function automatic string get_version(); // public | ||
| // Return BFM version as a string of three integers separated by periods. | ||
| // For example, version 9.1 sp1 is encoded as "9.1.1". | ||
| string ret_version = "15.1"; | ||
| return ret_version; | ||
| endfunction | ||
|
|
||
| task automatic clock_start(); // public | ||
| // Turn the clock on. By default the clock is initially turned on. | ||
| $sformat(message, "%m: Clock started"); | ||
| print(VERBOSITY_INFO, message); | ||
| run_state = 1; | ||
| endtask | ||
|
|
||
| task automatic clock_stop(); // public | ||
| // Turn the clock off. | ||
| $sformat(message, "%m: Clock stopped"); | ||
| print(VERBOSITY_INFO, message); | ||
| run_state = 0; | ||
| endtask | ||
|
|
||
| function automatic get_run_state(); // public | ||
| // Return the state of the clock source: running=1, stopped=0 | ||
| return run_state; | ||
| endfunction | ||
|
|
||
| initial begin | ||
| __hello(); | ||
| end | ||
|
|
||
| always begin | ||
| #HALF_CLOCK_PERIOD; | ||
| clk = run_state; | ||
|
|
||
| #HALF_CLOCK_PERIOD; | ||
| clk = 1'b0; | ||
| end | ||
| // synthesis translate_on | ||
|
|
||
| endmodule | ||
|
|
| @@ -0,0 +1,139 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // $File: //acds/rel/15.1/ip/sopc/components/verification/altera_avalon_interrupt_sink/altera_avalon_interrupt_sink.sv $ | ||
| // $Revision: #1 $ | ||
| // $Date: 2015/08/09 $ | ||
| // $Author: swbranch $ | ||
| //------------------------------------------------------------------------------ | ||
| // =head1 NAME | ||
| // altera_avalon_interrupt_sink | ||
| // =head1 SYNOPSIS | ||
| // Avalon Interrupt Sink Bus Functional Model (BFM) | ||
| //----------------------------------------------------------------------------- | ||
| // =head1 DESCRIPTION | ||
| // This is an Avalon Interrupt Sink Bus Functional Model (BFM) | ||
| //----------------------------------------------------------------------------- | ||
|
|
||
| `timescale 1ps / 1ps | ||
|
|
||
| module altera_avalon_interrupt_sink ( | ||
| clk, | ||
| reset, | ||
|
|
||
| irq | ||
| ); | ||
|
|
||
| parameter ASSERT_HIGH_IRQ = 1; // Ictive high irq | ||
| parameter AV_IRQ_W = 1; // Interrupt request bus width | ||
| parameter ASYNCHRONOUS_INTERRUPT = 0; // Asynchronous irq signal to its associated clock | ||
| parameter VHDL_ID = 0; // VHDL BFM ID number | ||
|
|
||
| // =head1 PINS | ||
| // =head2 Clock Interface | ||
| input clk; | ||
| input reset; | ||
|
|
||
| // =head2 Avalon Interrupt Sink Interface | ||
| input [AV_IRQ_W-1:0] irq; | ||
|
|
||
| // =cut | ||
|
|
||
| // synthesis translate_off | ||
| import verbosity_pkg::*; | ||
|
|
||
| //-------------------------------------------------------------------------- | ||
| // Internal Machinery | ||
| //-------------------------------------------------------------------------- | ||
|
|
||
| logic [AV_IRQ_W-1:0] irq_inactive = (ASSERT_HIGH_IRQ)? {AV_IRQ_W{1'b0}} : {AV_IRQ_W{1'b1}}; | ||
| logic [AV_IRQ_W-1:0] irq_register = irq_inactive; | ||
|
|
||
| if (ASYNCHRONOUS_INTERRUPT == 1) begin | ||
| always @(reset or irq) begin | ||
| if (reset) begin | ||
| irq_register = irq_inactive; | ||
| end else begin | ||
| irq_register = irq; | ||
| end | ||
| end | ||
| end else begin | ||
| always @(posedge clk) begin | ||
| if (reset) begin | ||
| irq_register <= irq_inactive; | ||
| end else begin | ||
| irq_register <= irq; | ||
| end | ||
| end | ||
| end | ||
|
|
||
| function automatic void hello(); | ||
| // Introduction Message to console | ||
| $sformat(message, "%m: - Hello from altera_avalon_interrupt_sink"); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - $Revision: #1 $"); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - $Date: 2015/08/09 $"); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - AV_IRQ_W = %0d", AV_IRQ_W); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - ASSERT_HIGH_IRQ = %0d", ASSERT_HIGH_IRQ); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - ASYNCHRONOUS_INTERRUPT = %0d", ASYNCHRONOUS_INTERRUPT); | ||
| print(VERBOSITY_INFO, message); | ||
| endfunction | ||
|
|
||
| initial begin | ||
| hello(); | ||
| end | ||
|
|
||
| //-------------------------------------------------------------------------- | ||
| // =head1 Public Methods API | ||
| // =pod | ||
| // This section describes the public methods in the application programming | ||
| // interface (API). In this case the application program is the test bench | ||
| // which instantiates and controls and queries state in this BFM component. | ||
| // Test programs must only use these public access methods and events to | ||
| // communicate with this BFM component. The API and the module pins | ||
| // are the only interfaces in this component that are guaranteed to be | ||
| // stable. The API will be maintained for the life of the product. | ||
| // While we cannot prevent a test program from directly accessing internal | ||
| // tasks, functions, or data private to the BFM, there is no guarantee that | ||
| // these will be present in the future. In fact, it is best for the user | ||
| // to assume that the underlying implementation of this component can | ||
| // and will change. | ||
| // =cut | ||
| //-------------------------------------------------------------------------- | ||
|
|
||
| function automatic string get_version(); // public | ||
| // Return BFM version as a string of three integers separated by periods. | ||
| // For example, version 9.1 sp1 is encoded as "9.1.1". | ||
| string ret_version = "15.1"; | ||
| return ret_version; | ||
| endfunction | ||
|
|
||
| function automatic logic [AV_IRQ_W-1:0] get_irq(); // public | ||
| $sformat(message, "%m: called get_irq"); | ||
| print(VERBOSITY_DEBUG, message); | ||
| return irq_register; | ||
| endfunction | ||
|
|
||
| function automatic void clear_irq(); // public | ||
| irq_register = irq_inactive; | ||
| $sformat(message, "%m: called clear_irq"); | ||
| print(VERBOSITY_DEBUG, message); | ||
| endfunction | ||
|
|
||
| // synthesis translate_on | ||
| endmodule | ||
|
|
| @@ -0,0 +1,102 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // $File: //acds/rel/15.1/ip/sopc/components/verification/altera_avalon_reset_source/altera_avalon_reset_source.sv $ | ||
| // $Revision: #1 $ | ||
| // $Date: 2015/08/09 $ | ||
| // $Author: swbranch $ | ||
| //------------------------------------------------------------------------------ | ||
| // Reset generator | ||
|
|
||
| `timescale 1ps / 1ps | ||
|
|
||
| module altera_avalon_reset_source ( | ||
| clk, | ||
| reset | ||
| ); | ||
| input clk; | ||
| output reset; | ||
|
|
||
| parameter ASSERT_HIGH_RESET = 1; // reset assertion level is high by default | ||
| parameter INITIAL_RESET_CYCLES = 0; // deassert after number of clk cycles | ||
|
|
||
| // synthesis translate_off | ||
| import verbosity_pkg::*; | ||
|
|
||
| logic reset = ASSERT_HIGH_RESET ? 1'b0 : 1'b1; | ||
|
|
||
| string message = "*uninitialized*"; | ||
|
|
||
| int clk_ctr = 0; | ||
|
|
||
| always @(posedge clk) begin | ||
| clk_ctr <= clk_ctr + 1; | ||
| end | ||
|
|
||
| always @(*) | ||
| if (clk_ctr == INITIAL_RESET_CYCLES) | ||
| reset_deassert(); | ||
|
|
||
|
|
||
| function automatic void __hello(); | ||
| $sformat(message, "%m: - Hello from altera_reset_source"); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - $Revision: #1 $"); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - $Date: 2015/08/09 $"); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - ASSERT_HIGH_RESET = %0d", ASSERT_HIGH_RESET); | ||
| print(VERBOSITY_INFO, message); | ||
| $sformat(message, "%m: - INITIAL_RESET_CYCLES = %0d", INITIAL_RESET_CYCLES); | ||
| print(VERBOSITY_INFO, message); | ||
| print_divider(VERBOSITY_INFO); | ||
| endfunction | ||
|
|
||
| function automatic string get_version(); // public | ||
| // Return BFM version as a string of three integers separated by periods. | ||
| // For example, version 9.1 sp1 is encoded as "9.1.1". | ||
| string ret_version = "15.1"; | ||
| return ret_version; | ||
| endfunction | ||
|
|
||
| task automatic reset_assert(); // public | ||
| $sformat(message, "%m: Reset asserted"); | ||
| print(VERBOSITY_INFO, message); | ||
|
|
||
| if (ASSERT_HIGH_RESET > 0) begin | ||
| reset = 1'b1; | ||
| end else begin | ||
| reset = 1'b0; | ||
| end | ||
| endtask | ||
|
|
||
| task automatic reset_deassert(); // public | ||
| $sformat(message, "%m: Reset deasserted"); | ||
| print(VERBOSITY_INFO, message); | ||
|
|
||
| if (ASSERT_HIGH_RESET > 0) begin | ||
| reset = 1'b0; | ||
| end else begin | ||
| reset = 1'b1; | ||
| end | ||
| endtask | ||
|
|
||
| initial begin | ||
| __hello(); | ||
| if (INITIAL_RESET_CYCLES > 0) | ||
| reset_assert(); | ||
| end | ||
| // synthesis translate_on | ||
|
|
||
| endmodule | ||
|
|
| @@ -0,0 +1,210 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // -------------------------------------------------------------------------------- | ||
| //| Avalon ST Bytes to Packet | ||
| // -------------------------------------------------------------------------------- | ||
|
|
||
| `timescale 1ns / 100ps | ||
| module altera_avalon_st_bytes_to_packets | ||
| //if ENCODING ==0, CHANNEL_WIDTH must be 8 | ||
| //else CHANNEL_WIDTH can be from 0 to 127 | ||
| #( parameter CHANNEL_WIDTH = 8, | ||
| parameter ENCODING = 0 ) | ||
| ( | ||
| // Interface: clk | ||
| input clk, | ||
| input reset_n, | ||
| // Interface: ST out with packets | ||
| input out_ready, | ||
| output reg out_valid, | ||
| output reg [7: 0] out_data, | ||
| output reg [CHANNEL_WIDTH-1: 0] out_channel, | ||
| output reg out_startofpacket, | ||
| output reg out_endofpacket, | ||
|
|
||
| // Interface: ST in | ||
| output reg in_ready, | ||
| input in_valid, | ||
| input [7: 0] in_data | ||
| ); | ||
|
|
||
| // --------------------------------------------------------------------- | ||
| //| Signal Declarations | ||
| // --------------------------------------------------------------------- | ||
|
|
||
| reg received_esc, received_channel, received_varchannel; | ||
| wire escape_char, sop_char, eop_char, channel_char, varchannelesc_char; | ||
|
|
||
| // data out mux. | ||
| // we need it twice (data & channel out), so use a wire here | ||
| wire [7:0] data_out; | ||
|
|
||
| // --------------------------------------------------------------------- | ||
| //| Thingofamagick | ||
| // --------------------------------------------------------------------- | ||
|
|
||
| assign sop_char = (in_data == 8'h7a); | ||
| assign eop_char = (in_data == 8'h7b); | ||
| assign channel_char = (in_data == 8'h7c); | ||
| assign escape_char = (in_data == 8'h7d); | ||
|
|
||
| assign data_out = received_esc ? (in_data ^ 8'h20) : in_data; | ||
|
|
||
| generate | ||
| if (CHANNEL_WIDTH == 0) begin | ||
| // Synchorous block -- reset and registers | ||
| always @(posedge clk or negedge reset_n) begin | ||
| if (!reset_n) begin | ||
| received_esc <= 0; | ||
| out_startofpacket <= 0; | ||
| out_endofpacket <= 0; | ||
| end else begin | ||
| // we take data when in_valid and in_ready | ||
| if (in_valid & in_ready) begin | ||
| if (received_esc) begin | ||
| //if we got esc char, after next byte is consumed, quit esc mode | ||
| if (out_ready) received_esc <= 0; | ||
| end else begin | ||
| if (escape_char) received_esc <= 1; | ||
| if (sop_char) out_startofpacket <= 1; | ||
| if (eop_char) out_endofpacket <= 1; | ||
| end | ||
| if (out_ready & out_valid) begin | ||
| out_startofpacket <= 0; | ||
| out_endofpacket <= 0; | ||
| end | ||
| end | ||
| end | ||
| end | ||
|
|
||
| // Combinational block for in_ready and out_valid | ||
| always @* begin | ||
| //we choose not to pipeline here. We can process special characters when | ||
| //in_ready, but in a chain of microcores, backpressure path is usually | ||
| //time critical, so we keep it simple here. | ||
| in_ready = out_ready; | ||
|
|
||
| //out_valid when in_valid, except when we are processing the special | ||
| //characters. However, if we are in escape received mode, then we are | ||
| //valid | ||
| out_valid = 0; | ||
| if ((out_ready | ~out_valid) && in_valid) begin | ||
| out_valid = 1; | ||
| if (sop_char | eop_char | escape_char | channel_char) out_valid = 0; | ||
| end | ||
| out_data = data_out; | ||
| end | ||
|
|
||
| end else begin | ||
| assign varchannelesc_char = in_data[7]; | ||
| // Synchorous block -- reset and registers | ||
| always @(posedge clk or negedge reset_n) begin | ||
| if (!reset_n) begin | ||
| received_esc <= 0; | ||
| received_channel <= 0; | ||
| received_varchannel <= 0; | ||
| out_startofpacket <= 0; | ||
| out_endofpacket <= 0; | ||
| end else begin | ||
| // we take data when in_valid and in_ready | ||
| if (in_valid & in_ready) begin | ||
| if (received_esc) begin | ||
| //if we got esc char, after next byte is consumed, quit esc mode | ||
| if (out_ready | received_channel | received_varchannel) received_esc <= 0; | ||
| end else begin | ||
| if (escape_char) received_esc <= 1; | ||
| if (sop_char) out_startofpacket <= 1; | ||
| if (eop_char) out_endofpacket <= 1; | ||
| if (channel_char & ENCODING ) received_varchannel <= 1; | ||
| if (channel_char & ~ENCODING) received_channel <= 1; | ||
| end | ||
| if (received_channel & (received_esc | (~sop_char & ~eop_char & ~escape_char & ~channel_char ))) begin | ||
| received_channel <= 0; | ||
| end | ||
| if (received_varchannel & ~varchannelesc_char & (received_esc | (~sop_char & ~eop_char & ~escape_char & ~channel_char))) begin | ||
| received_varchannel <= 0; | ||
| end | ||
| if (out_ready & out_valid) begin | ||
| out_startofpacket <= 0; | ||
| out_endofpacket <= 0; | ||
| end | ||
| end | ||
| end | ||
| end | ||
|
|
||
| // Combinational block for in_ready and out_valid | ||
| always @* begin | ||
| in_ready = out_ready; | ||
| out_valid = 0; | ||
| if ((out_ready | ~out_valid) && in_valid) begin | ||
| out_valid = 1; | ||
| if (received_esc) begin | ||
| if (received_channel | received_varchannel) out_valid = 0; | ||
| end else begin | ||
| if (sop_char | eop_char | escape_char | channel_char | received_channel | received_varchannel) out_valid = 0; | ||
| end | ||
| end | ||
| out_data = data_out; | ||
| end | ||
| end | ||
|
|
||
| endgenerate | ||
|
|
||
| // Channel block | ||
| generate | ||
| if (CHANNEL_WIDTH == 0) begin | ||
| always @(posedge clk) begin | ||
| out_channel <= 'h0; | ||
| end | ||
|
|
||
| end else if (CHANNEL_WIDTH < 8) begin | ||
| always @(posedge clk or negedge reset_n) begin | ||
| if (!reset_n) begin | ||
| out_channel <= 'h0; | ||
| end else begin | ||
| if (in_ready & in_valid) begin | ||
| if ((channel_char & ENCODING) & (~received_esc & ~sop_char & ~eop_char & ~escape_char )) begin | ||
| out_channel <= 'h0; | ||
| end else if (received_varchannel & (received_esc | (~sop_char & ~eop_char & ~escape_char & ~channel_char & ~received_channel))) begin | ||
| // Shifting out only the required bits | ||
| out_channel[CHANNEL_WIDTH-1:0] <= data_out[CHANNEL_WIDTH-1:0]; | ||
| end | ||
| end | ||
| end | ||
| end | ||
|
|
||
| end else begin | ||
| always @(posedge clk or negedge reset_n) begin | ||
| if (!reset_n) begin | ||
| out_channel <= 'h0; | ||
| end else begin | ||
| if (in_ready & in_valid) begin | ||
| if (received_channel & (received_esc | (~sop_char & ~eop_char & ~escape_char & ~channel_char))) begin | ||
| out_channel <= data_out; | ||
| end else if ((channel_char & ENCODING) & (~received_esc & ~sop_char & ~eop_char & ~escape_char )) begin | ||
| // Variable Channel Encoding always setting to 0 before begin to shift the channel in | ||
| out_channel <= 'h0; | ||
| end else if (received_varchannel & (received_esc | (~sop_char & ~eop_char & ~escape_char & ~channel_char & ~received_channel))) begin | ||
| // Shifting out the lower 7 bits | ||
| out_channel <= out_channel <<7; | ||
| out_channel[6:0] <= data_out[6:0]; | ||
| end | ||
| end | ||
| end | ||
| end | ||
|
|
||
| end | ||
| endgenerate | ||
|
|
||
| endmodule |
| @@ -0,0 +1,141 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // $File: //acds/rel/15.1/ip/avalon_st/altera_avalon_st_handshake_clock_crosser/altera_avalon_st_clock_crosser.v $ | ||
| // $Revision: #1 $ | ||
| // $Date: 2015/08/09 $ | ||
| // $Author: swbranch $ | ||
| //------------------------------------------------------------------------------ | ||
|
|
||
| `timescale 1ns / 1ns | ||
|
|
||
| module altera_avalon_st_clock_crosser( | ||
| in_clk, | ||
| in_reset, | ||
| in_ready, | ||
| in_valid, | ||
| in_data, | ||
| out_clk, | ||
| out_reset, | ||
| out_ready, | ||
| out_valid, | ||
| out_data | ||
| ); | ||
|
|
||
| parameter SYMBOLS_PER_BEAT = 1; | ||
| parameter BITS_PER_SYMBOL = 8; | ||
| parameter FORWARD_SYNC_DEPTH = 2; | ||
| parameter BACKWARD_SYNC_DEPTH = 2; | ||
| parameter USE_OUTPUT_PIPELINE = 1; | ||
|
|
||
| localparam DATA_WIDTH = SYMBOLS_PER_BEAT * BITS_PER_SYMBOL; | ||
|
|
||
| input in_clk; | ||
| input in_reset; | ||
| output in_ready; | ||
| input in_valid; | ||
| input [DATA_WIDTH-1:0] in_data; | ||
|
|
||
| input out_clk; | ||
| input out_reset; | ||
| input out_ready; | ||
| output out_valid; | ||
| output [DATA_WIDTH-1:0] out_data; | ||
|
|
||
| // Data is guaranteed valid by control signal clock crossing. Cut data | ||
| // buffer false path. | ||
| (* altera_attribute = {"-name SUPPRESS_DA_RULE_INTERNAL \"D101,D102\""} *) reg [DATA_WIDTH-1:0] in_data_buffer; | ||
| reg [DATA_WIDTH-1:0] out_data_buffer; | ||
|
|
||
| reg in_data_toggle; | ||
| wire in_data_toggle_returned; | ||
| wire out_data_toggle; | ||
| reg out_data_toggle_flopped; | ||
|
|
||
| wire take_in_data; | ||
| wire out_data_taken; | ||
|
|
||
| wire out_valid_internal; | ||
| wire out_ready_internal; | ||
|
|
||
| assign in_ready = ~(in_data_toggle_returned ^ in_data_toggle); | ||
| assign take_in_data = in_valid & in_ready; | ||
| assign out_valid_internal = out_data_toggle ^ out_data_toggle_flopped; | ||
| assign out_data_taken = out_ready_internal & out_valid_internal; | ||
|
|
||
| always @(posedge in_clk or posedge in_reset) begin | ||
| if (in_reset) begin | ||
| in_data_buffer <= {DATA_WIDTH{1'b0}}; | ||
| in_data_toggle <= 1'b0; | ||
| end else begin | ||
| if (take_in_data) begin | ||
| in_data_toggle <= ~in_data_toggle; | ||
| in_data_buffer <= in_data; | ||
| end | ||
| end //in_reset | ||
| end //in_clk always block | ||
|
|
||
| always @(posedge out_clk or posedge out_reset) begin | ||
| if (out_reset) begin | ||
| out_data_toggle_flopped <= 1'b0; | ||
| out_data_buffer <= {DATA_WIDTH{1'b0}}; | ||
| end else begin | ||
| out_data_buffer <= in_data_buffer; | ||
| if (out_data_taken) begin | ||
| out_data_toggle_flopped <= out_data_toggle; | ||
| end | ||
| end //end if | ||
| end //out_clk always block | ||
|
|
||
| altera_std_synchronizer_nocut #(.depth(FORWARD_SYNC_DEPTH)) in_to_out_synchronizer ( | ||
| .clk(out_clk), | ||
| .reset_n(~out_reset), | ||
| .din(in_data_toggle), | ||
| .dout(out_data_toggle) | ||
| ); | ||
|
|
||
| altera_std_synchronizer_nocut #(.depth(BACKWARD_SYNC_DEPTH)) out_to_in_synchronizer ( | ||
| .clk(in_clk), | ||
| .reset_n(~in_reset), | ||
| .din(out_data_toggle_flopped), | ||
| .dout(in_data_toggle_returned) | ||
| ); | ||
|
|
||
| generate if (USE_OUTPUT_PIPELINE == 1) begin | ||
|
|
||
| altera_avalon_st_pipeline_base | ||
| #( | ||
| .BITS_PER_SYMBOL(BITS_PER_SYMBOL), | ||
| .SYMBOLS_PER_BEAT(SYMBOLS_PER_BEAT) | ||
| ) output_stage ( | ||
| .clk(out_clk), | ||
| .reset(out_reset), | ||
| .in_ready(out_ready_internal), | ||
| .in_valid(out_valid_internal), | ||
| .in_data(out_data_buffer), | ||
| .out_ready(out_ready), | ||
| .out_valid(out_valid), | ||
| .out_data(out_data) | ||
| ); | ||
|
|
||
| end else begin | ||
|
|
||
| assign out_valid = out_valid_internal; | ||
| assign out_ready_internal = out_ready; | ||
| assign out_data = out_data_buffer; | ||
|
|
||
| end | ||
|
|
||
| endgenerate | ||
|
|
||
| endmodule |
| @@ -0,0 +1,72 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // -------------------------------------------------------------------------------- | ||
| //| Avalon ST Idle Inserter | ||
| // -------------------------------------------------------------------------------- | ||
|
|
||
| `timescale 1ns / 100ps | ||
| module altera_avalon_st_idle_inserter ( | ||
|
|
||
| // Interface: clk | ||
| input clk, | ||
| input reset_n, | ||
| // Interface: ST in | ||
| output reg in_ready, | ||
| input in_valid, | ||
| input [7: 0] in_data, | ||
|
|
||
| // Interface: ST out | ||
| input out_ready, | ||
| output reg out_valid, | ||
| output reg [7: 0] out_data | ||
| ); | ||
|
|
||
| // --------------------------------------------------------------------- | ||
| //| Signal Declarations | ||
| // --------------------------------------------------------------------- | ||
|
|
||
| reg received_esc; | ||
| wire escape_char, idle_char; | ||
|
|
||
| // --------------------------------------------------------------------- | ||
| //| Thingofamagick | ||
| // --------------------------------------------------------------------- | ||
|
|
||
| assign idle_char = (in_data == 8'h4a); | ||
| assign escape_char = (in_data == 8'h4d); | ||
|
|
||
| always @(posedge clk or negedge reset_n) begin | ||
| if (!reset_n) begin | ||
| received_esc <= 0; | ||
| end else begin | ||
| if (in_valid & out_ready) begin | ||
| if ((idle_char | escape_char) & ~received_esc & out_ready) begin | ||
| received_esc <= 1; | ||
| end else begin | ||
| received_esc <= 0; | ||
| end | ||
| end | ||
| end | ||
| end | ||
|
|
||
| always @* begin | ||
| //we are always valid | ||
| out_valid = 1'b1; | ||
| in_ready = out_ready & (~in_valid | ((~idle_char & ~escape_char) | received_esc)); | ||
| out_data = (~in_valid) ? 8'h4a : //if input is not valid, insert idle | ||
| (received_esc) ? in_data ^ 8'h20 : //escaped once, send data XOR'd | ||
| (idle_char | escape_char) ? 8'h4d : //input needs escaping, send escape_char | ||
| in_data; //send data | ||
| end | ||
| endmodule |
| @@ -0,0 +1,70 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // -------------------------------------------------------------------------------- | ||
| //| Avalon ST Idle Remover | ||
| // -------------------------------------------------------------------------------- | ||
|
|
||
| `timescale 1ns / 100ps | ||
| module altera_avalon_st_idle_remover ( | ||
|
|
||
| // Interface: clk | ||
| input clk, | ||
| input reset_n, | ||
| // Interface: ST in | ||
| output reg in_ready, | ||
| input in_valid, | ||
| input [7: 0] in_data, | ||
|
|
||
| // Interface: ST out | ||
| input out_ready, | ||
| output reg out_valid, | ||
| output reg [7: 0] out_data | ||
| ); | ||
|
|
||
| // --------------------------------------------------------------------- | ||
| //| Signal Declarations | ||
| // --------------------------------------------------------------------- | ||
|
|
||
| reg received_esc; | ||
| wire escape_char, idle_char; | ||
|
|
||
| // --------------------------------------------------------------------- | ||
| //| Thingofamagick | ||
| // --------------------------------------------------------------------- | ||
|
|
||
| assign idle_char = (in_data == 8'h4a); | ||
| assign escape_char = (in_data == 8'h4d); | ||
|
|
||
| always @(posedge clk or negedge reset_n) begin | ||
| if (!reset_n) begin | ||
| received_esc <= 0; | ||
| end else begin | ||
| if (in_valid & in_ready) begin | ||
| if (escape_char & ~received_esc) begin | ||
| received_esc <= 1; | ||
| end else if (out_valid) begin | ||
| received_esc <= 0; | ||
| end | ||
| end | ||
| end | ||
| end | ||
|
|
||
| always @* begin | ||
| in_ready = out_ready; | ||
| //out valid when in_valid. Except when we get idle or escape | ||
| //however, if we have received an escape character, then we are valid | ||
| out_valid = in_valid & ~idle_char & (received_esc | ~escape_char); | ||
| out_data = received_esc ? (in_data ^ 8'h20) : in_data; | ||
| end | ||
| endmodule |
| @@ -0,0 +1,14 @@ | ||
| # (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| # Your use of Altera Corporation's design tools, logic functions and other | ||
| # software and tools, and its AMPP partner logic functions, and any output | ||
| # files any of the foregoing (including device programming or simulation | ||
| # files), and any associated documentation or information are expressly subject | ||
| # to the terms and conditions of the Altera Program License Subscription | ||
| # Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| # license agreement, including, without limitation, that your use is for the | ||
| # sole purpose of programming logic devices manufactured by Altera and sold by | ||
| # Altera or its authorized distributors. Please refer to the applicable | ||
| # agreement for further details. | ||
|
|
||
|
|
||
| set_false_path -from [get_registers *altera_jtag_src_crosser:*|sink_data_buffer*] -to [get_registers *altera_jtag_src_crosser:*|src_data*] |
| @@ -0,0 +1,224 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // This top level module chooses between the original Altera-ST JTAG Interface | ||
| // component in ACDS version 8.1 and before, and the new one with the PLI | ||
| // Simulation mode turned on, which adds a wrapper over the original component. | ||
|
|
||
| `timescale 1 ns / 1 ns | ||
|
|
||
| module altera_avalon_st_jtag_interface #( | ||
| parameter PURPOSE = 0, // for discovery of services behind this JTAG Phy - 0 | ||
| // for JTAG Phy, 1 for Packets to Master | ||
| parameter UPSTREAM_FIFO_SIZE = 0, | ||
| parameter DOWNSTREAM_FIFO_SIZE = 0, | ||
| parameter MGMT_CHANNEL_WIDTH = -1, | ||
| parameter EXPORT_JTAG = 0, | ||
| parameter USE_PLI = 0, // set to 1 enable PLI Simulation Mode | ||
| parameter PLI_PORT = 50000 // PLI Simulation Port | ||
| ) ( | ||
| input wire jtag_tck, | ||
| input wire jtag_tms, | ||
| input wire jtag_tdi, | ||
| output wire jtag_tdo, | ||
| input wire jtag_ena, | ||
| input wire jtag_usr1, | ||
| input wire jtag_clr, | ||
| input wire jtag_clrn, | ||
| input wire jtag_state_tlr, | ||
| input wire jtag_state_rti, | ||
| input wire jtag_state_sdrs, | ||
| input wire jtag_state_cdr, | ||
| input wire jtag_state_sdr, | ||
| input wire jtag_state_e1dr, | ||
| input wire jtag_state_pdr, | ||
| input wire jtag_state_e2dr, | ||
| input wire jtag_state_udr, | ||
| input wire jtag_state_sirs, | ||
| input wire jtag_state_cir, | ||
| input wire jtag_state_sir, | ||
| input wire jtag_state_e1ir, | ||
| input wire jtag_state_pir, | ||
| input wire jtag_state_e2ir, | ||
| input wire jtag_state_uir, | ||
| input wire [2:0] jtag_ir_in, | ||
| output wire jtag_irq, | ||
| output wire [2:0] jtag_ir_out, | ||
| input wire clk, | ||
| input wire reset_n, | ||
| input wire source_ready, | ||
| output wire [7:0] source_data, | ||
| output wire source_valid, | ||
| input wire [7:0] sink_data, | ||
| input wire sink_valid, | ||
| output wire sink_ready, | ||
| output wire resetrequest, | ||
| output wire debug_reset, | ||
| output wire mgmt_valid, | ||
| output wire [(MGMT_CHANNEL_WIDTH>0?MGMT_CHANNEL_WIDTH:1)-1:0] mgmt_channel, | ||
| output wire mgmt_data | ||
| ); | ||
|
|
||
| // Signals in the JTAG clock domain | ||
| wire tck; | ||
| wire tdi; | ||
| wire tdo; | ||
| wire [2:0] ir_in; | ||
| wire virtual_state_cdr; | ||
| wire virtual_state_sdr; | ||
| wire virtual_state_udr; | ||
|
|
||
| assign jtag_irq = 1'b0; | ||
| assign jtag_ir_out = 3'b000; | ||
|
|
||
| generate | ||
| if (EXPORT_JTAG == 0) begin | ||
| // SLD node instantiation | ||
| altera_jtag_sld_node node ( | ||
| .tck (tck), | ||
| .tdi (tdi), | ||
| .tdo (tdo), | ||
| .ir_out (1'b0), | ||
| .ir_in (ir_in), | ||
| .virtual_state_cdr (virtual_state_cdr), | ||
| .virtual_state_cir (), | ||
| .virtual_state_e1dr (), | ||
| .virtual_state_e2dr (), | ||
| .virtual_state_pdr (), | ||
| .virtual_state_sdr (virtual_state_sdr), | ||
| .virtual_state_udr (virtual_state_udr), | ||
| .virtual_state_uir () | ||
| ); | ||
|
|
||
| assign jtag_tdo = 1'b0; | ||
| end else begin | ||
| assign tck = jtag_tck; | ||
| assign tdi = jtag_tdi; | ||
| assign jtag_tdo = tdo; | ||
| assign ir_in = jtag_ir_in; | ||
| assign virtual_state_cdr = jtag_ena && !jtag_usr1 && jtag_state_cdr; | ||
| assign virtual_state_sdr = jtag_ena && !jtag_usr1 && jtag_state_sdr; | ||
| assign virtual_state_udr = jtag_ena && !jtag_usr1 && jtag_state_udr; | ||
| end | ||
| endgenerate | ||
|
|
||
| generate | ||
| if (USE_PLI == 0) | ||
| begin : normal | ||
| altera_jtag_dc_streaming #( | ||
| .PURPOSE(PURPOSE), | ||
| .UPSTREAM_FIFO_SIZE(UPSTREAM_FIFO_SIZE), | ||
| .DOWNSTREAM_FIFO_SIZE(DOWNSTREAM_FIFO_SIZE), | ||
| .MGMT_CHANNEL_WIDTH(MGMT_CHANNEL_WIDTH) | ||
| ) jtag_dc_streaming ( | ||
| .tck (tck), | ||
| .tdi (tdi), | ||
| .tdo (tdo), | ||
| .ir_in (ir_in), | ||
| .virtual_state_cdr(virtual_state_cdr), | ||
| .virtual_state_sdr(virtual_state_sdr), | ||
| .virtual_state_udr(virtual_state_udr), | ||
| .clk(clk), | ||
| .reset_n(reset_n), | ||
| .source_data(source_data), | ||
| .source_valid(source_valid), | ||
| .sink_data(sink_data), | ||
| .sink_valid(sink_valid), | ||
| .sink_ready(sink_ready), | ||
| .resetrequest(resetrequest), | ||
| .debug_reset(debug_reset), | ||
| .mgmt_valid(mgmt_valid), | ||
| .mgmt_channel(mgmt_channel), | ||
| .mgmt_data(mgmt_data) | ||
| ); | ||
|
|
||
| end | ||
| else | ||
| begin : pli_mode | ||
|
|
||
| //synthesis translate_off | ||
| reg pli_out_valid; | ||
| reg pli_in_ready; | ||
| reg [7 : 0] pli_out_data; | ||
|
|
||
| always @(posedge clk or negedge reset_n) begin | ||
| if (!reset_n) begin | ||
| pli_out_valid <= 0; | ||
| pli_out_data <= 'b0; | ||
| pli_in_ready <= 0; | ||
| end | ||
| else begin | ||
| `ifdef MODEL_TECH | ||
| $do_transaction( | ||
| PLI_PORT, | ||
| pli_out_valid, | ||
| source_ready, | ||
| pli_out_data, | ||
| sink_valid, | ||
| pli_in_ready, | ||
| sink_data | ||
| ); | ||
| `endif | ||
| end | ||
| end | ||
|
|
||
| //synthesis translate_on | ||
| wire [7:0] jtag_source_data; | ||
| wire jtag_source_valid; | ||
| wire jtag_sink_ready; | ||
| wire jtag_resetrequest; | ||
|
|
||
| altera_jtag_dc_streaming #( | ||
| .PURPOSE(PURPOSE), | ||
| .UPSTREAM_FIFO_SIZE(UPSTREAM_FIFO_SIZE), | ||
| .DOWNSTREAM_FIFO_SIZE(DOWNSTREAM_FIFO_SIZE), | ||
| .MGMT_CHANNEL_WIDTH(MGMT_CHANNEL_WIDTH) | ||
| ) jtag_dc_streaming ( | ||
| .tck (tck), | ||
| .tdi (tdi), | ||
| .tdo (tdo), | ||
| .ir_in (ir_in), | ||
| .virtual_state_cdr(virtual_state_cdr), | ||
| .virtual_state_sdr(virtual_state_sdr), | ||
| .virtual_state_udr(virtual_state_udr), | ||
| .clk(clk), | ||
| .reset_n(reset_n), | ||
| .source_data(jtag_source_data), | ||
| .source_valid(jtag_source_valid), | ||
| .sink_data(sink_data), | ||
| .sink_valid(sink_valid), | ||
| .sink_ready(jtag_sink_ready), | ||
| .resetrequest(jtag_resetrequest)//, | ||
| //.debug_reset(debug_reset), | ||
| //.mgmt_valid(mgmt_valid), | ||
| //.mgmt_channel(mgmt_channel), | ||
| //.mgmt_data(mgmt_data) | ||
| ); | ||
|
|
||
| // synthesis read_comments_as_HDL on | ||
| // assign source_valid = jtag_source_valid; | ||
| // assign source_data = jtag_source_data; | ||
| // assign sink_ready = jtag_sink_ready; | ||
| // assign resetrequest = jtag_resetrequest; | ||
| // synthesis read_comments_as_HDL off | ||
|
|
||
| //synthesis translate_off | ||
| assign source_valid = pli_out_valid; | ||
| assign source_data = pli_out_data; | ||
| assign sink_ready = pli_in_ready; | ||
| assign resetrequest = 1'b0; | ||
| //synthesis translate_on | ||
| assign jtag_tdo = 1'b0; | ||
| end | ||
| endgenerate | ||
| endmodule |
| @@ -0,0 +1,253 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // -------------------------------------------------------------------------------- | ||
| //| Avalon ST Packets to Bytes Component | ||
| // -------------------------------------------------------------------------------- | ||
|
|
||
| `timescale 1ns / 100ps | ||
| module altera_avalon_st_packets_to_bytes | ||
| //if ENCODING ==0, CHANNEL_WIDTH must be 8 | ||
| //else CHANNEL_WIDTH can be from 0 to 127 | ||
| #( parameter CHANNEL_WIDTH = 8, | ||
| parameter ENCODING = 0) | ||
| ( | ||
| // Interface: clk | ||
| input clk, | ||
| input reset_n, | ||
| // Interface: ST in with packets | ||
| output reg in_ready, | ||
| input in_valid, | ||
| input [7: 0] in_data, | ||
| input [CHANNEL_WIDTH-1: 0] in_channel, | ||
| input in_startofpacket, | ||
| input in_endofpacket, | ||
|
|
||
| // Interface: ST out | ||
| input out_ready, | ||
| output reg out_valid, | ||
| output reg [7: 0] out_data | ||
| ); | ||
|
|
||
| // --------------------------------------------------------------------- | ||
| //| Signal Declarations | ||
| // --------------------------------------------------------------------- | ||
|
|
||
| localparam CHN_COUNT = (CHANNEL_WIDTH-1)/7; | ||
| localparam CHN_EFFECTIVE = CHANNEL_WIDTH-1; | ||
| reg sent_esc, sent_sop, sent_eop; | ||
| reg sent_channel_char, channel_escaped, sent_channel; | ||
| reg [CHANNEL_WIDTH:0] stored_channel; | ||
| reg [4:0] channel_count; | ||
| reg [((CHN_EFFECTIVE/7+1)*7)-1:0] stored_varchannel; | ||
| reg channel_needs_esc; | ||
|
|
||
|
|
||
|
|
||
| wire need_sop, need_eop, need_esc, need_channel; | ||
|
|
||
| // --------------------------------------------------------------------- | ||
| //| Thingofamagick | ||
| // --------------------------------------------------------------------- | ||
|
|
||
| assign need_esc = (in_data === 8'h7a | | ||
| in_data === 8'h7b | | ||
| in_data === 8'h7c | | ||
| in_data === 8'h7d ); | ||
| assign need_eop = (in_endofpacket); | ||
| assign need_sop = (in_startofpacket); | ||
|
|
||
|
|
||
| generate | ||
| if( CHANNEL_WIDTH > 0) begin | ||
| wire channel_changed; | ||
| assign channel_changed = (in_channel != stored_channel); | ||
| assign need_channel = (need_sop | channel_changed); | ||
|
|
||
| always @(posedge clk or negedge reset_n) begin | ||
| if (!reset_n) begin | ||
| sent_esc <= 0; | ||
| sent_sop <= 0; | ||
| sent_eop <= 0; | ||
| sent_channel <= 0; | ||
| channel_escaped <= 0; | ||
| sent_channel_char <= 0; | ||
| out_data <= 0; | ||
| out_valid <= 0; | ||
| channel_count <= 0; | ||
| channel_needs_esc <= 0; | ||
| end else begin | ||
|
|
||
| if (out_ready ) | ||
| out_valid <= 0; | ||
|
|
||
| if ((out_ready | ~out_valid) && in_valid ) | ||
| out_valid <= 1; | ||
|
|
||
| if ((out_ready | ~out_valid) && in_valid) begin | ||
| if (need_channel & ~sent_channel) begin | ||
| if (~sent_channel_char) begin | ||
| sent_channel_char <= 1; | ||
| out_data <= 8'h7c; | ||
| channel_count <= CHN_COUNT[4:0]; | ||
| stored_varchannel <= in_channel; | ||
| if ((ENCODING == 0) | (CHANNEL_WIDTH == 7)) begin | ||
| channel_needs_esc <= (in_channel == 8'h7a | | ||
| in_channel == 8'h7b | | ||
| in_channel == 8'h7c | | ||
| in_channel == 8'h7d ); | ||
| end | ||
| end else if (channel_needs_esc & ~channel_escaped) begin | ||
| out_data <= 8'h7d; | ||
| channel_escaped <= 1; | ||
| end else if (~sent_channel) begin | ||
| if (ENCODING) begin | ||
| // Sending out MSB=1, while not last 7 bits of Channel | ||
| if (channel_count > 0) begin | ||
| if (channel_needs_esc) out_data <= {1'b1, stored_varchannel[((CHN_EFFECTIVE/7+1)*7)-1:((CHN_EFFECTIVE/7+1)*7)-7]} ^ 8'h20; | ||
| else out_data <= {1'b1, stored_varchannel[((CHN_EFFECTIVE/7+1)*7)-1:((CHN_EFFECTIVE/7+1)*7)-7]}; | ||
| stored_varchannel <= stored_varchannel<<7; | ||
|
|
||
| channel_count <= channel_count - 1'b1; | ||
| // check whether the last 7 bits need escape or not | ||
| if (channel_count ==1 & CHANNEL_WIDTH > 7) begin | ||
| channel_needs_esc <= | ||
| ((stored_varchannel[((CHN_EFFECTIVE/7+1)*7)-8:((CHN_EFFECTIVE/7+1)*7)-14] == 7'h7a)| | ||
| (stored_varchannel[((CHN_EFFECTIVE/7+1)*7)-8:((CHN_EFFECTIVE/7+1)*7)-14] == 7'h7b) | | ||
| (stored_varchannel[((CHN_EFFECTIVE/7+1)*7)-8:((CHN_EFFECTIVE/7+1)*7)-14] == 7'h7c) | | ||
| (stored_varchannel[((CHN_EFFECTIVE/7+1)*7)-8:((CHN_EFFECTIVE/7+1)*7)-14] == 7'h7d) ); | ||
| end | ||
| end else begin | ||
| // Sending out MSB=0, last 7 bits of Channel | ||
| if (channel_needs_esc) begin | ||
| channel_needs_esc <= 0; | ||
| out_data <= {1'b0, stored_varchannel[((CHN_EFFECTIVE/7+1)*7)-1:((CHN_EFFECTIVE/7+1)*7)-7]} ^ 8'h20; | ||
| end else out_data <= {1'b0, stored_varchannel[((CHN_EFFECTIVE/7+1)*7)-1:((CHN_EFFECTIVE/7+1)*7)-7]}; | ||
| sent_channel <= 1; | ||
| end | ||
| end else begin | ||
| if (channel_needs_esc) begin | ||
| channel_needs_esc <= 0; | ||
| out_data <= in_channel ^ 8'h20; | ||
| end else out_data <= in_channel; | ||
| sent_channel <= 1; | ||
| end | ||
| end | ||
| end else if (need_sop & ~sent_sop) begin | ||
| sent_sop <= 1; | ||
| out_data <= 8'h7a; | ||
|
|
||
| end else if (need_eop & ~sent_eop) begin | ||
| sent_eop <= 1; | ||
| out_data <= 8'h7b; | ||
|
|
||
| end else if (need_esc & ~sent_esc) begin | ||
| sent_esc <= 1; | ||
| out_data <= 8'h7d; | ||
| end else begin | ||
| if (sent_esc) out_data <= in_data ^ 8'h20; | ||
| else out_data <= in_data; | ||
| sent_esc <= 0; | ||
| sent_sop <= 0; | ||
| sent_eop <= 0; | ||
| sent_channel <= 0; | ||
| channel_escaped <= 0; | ||
| sent_channel_char <= 0; | ||
| end | ||
| end | ||
| end | ||
| end | ||
|
|
||
| //channel related signals | ||
| always @(posedge clk or negedge reset_n) begin | ||
| if (!reset_n) begin | ||
| //extra bit in stored_channel to force reset | ||
| stored_channel <= {CHANNEL_WIDTH{1'b1}}; | ||
| end else begin | ||
| //update stored_channel only when it is sent out | ||
| if (sent_channel) stored_channel <= in_channel; | ||
| end | ||
| end | ||
| always @* begin | ||
|
|
||
| // in_ready. Low when: | ||
| // back pressured, or when | ||
| // we are outputting a control character, which means that one of | ||
| // {escape_char, start of packet, end of packet, channel} | ||
| // needs to be, but has not yet, been handled. | ||
| in_ready = (out_ready | !out_valid) & in_valid & (~need_esc | sent_esc) | ||
| & (~need_sop | sent_sop) | ||
| & (~need_eop | sent_eop) | ||
| & (~need_channel | sent_channel); | ||
| end | ||
|
|
||
| end else begin | ||
|
|
||
| assign need_channel = (need_sop); | ||
|
|
||
| always @(posedge clk or negedge reset_n) begin | ||
| if (!reset_n) begin | ||
| sent_esc <= 0; | ||
| sent_sop <= 0; | ||
| sent_eop <= 0; | ||
| out_data <= 0; | ||
| out_valid <= 0; | ||
| sent_channel <= 0; | ||
| sent_channel_char <= 0; | ||
| end else begin | ||
|
|
||
| if (out_ready ) | ||
| out_valid <= 0; | ||
|
|
||
| if ((out_ready | ~out_valid) && in_valid ) | ||
| out_valid <= 1; | ||
|
|
||
| if ((out_ready | ~out_valid) && in_valid) begin | ||
| if (need_channel & ~sent_channel) begin | ||
| if (~sent_channel_char) begin //Added sent channel 0 before the 1st SOP | ||
| sent_channel_char <= 1; | ||
| out_data <= 8'h7c; | ||
| end else if (~sent_channel) begin | ||
| out_data <= 'h0; | ||
| sent_channel <= 1; | ||
| end | ||
| end else if (need_sop & ~sent_sop) begin | ||
| sent_sop <= 1; | ||
| out_data <= 8'h7a; | ||
| end else if (need_eop & ~sent_eop) begin | ||
| sent_eop <= 1; | ||
| out_data <= 8'h7b; | ||
| end else if (need_esc & ~sent_esc) begin | ||
| sent_esc <= 1; | ||
| out_data <= 8'h7d; | ||
| end else begin | ||
| if (sent_esc) out_data <= in_data ^ 8'h20; | ||
| else out_data <= in_data; | ||
| sent_esc <= 0; | ||
| sent_sop <= 0; | ||
| sent_eop <= 0; | ||
| end | ||
| end | ||
| end | ||
| end | ||
|
|
||
| always @* begin | ||
| in_ready = (out_ready | !out_valid) & in_valid & (~need_esc | sent_esc) | ||
| & (~need_sop | sent_sop) | ||
| & (~need_eop | sent_eop) | ||
| & (~need_channel | sent_channel); | ||
| end | ||
| end | ||
| endgenerate | ||
|
|
||
| endmodule |
| @@ -0,0 +1,139 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // $File: //acds/rel/15.1/ip/avalon_st/altera_avalon_st_pipeline_stage/altera_avalon_st_pipeline_base.v $ | ||
| // $Revision: #1 $ | ||
| // $Date: 2015/08/09 $ | ||
| // $Author: swbranch $ | ||
| //------------------------------------------------------------------------------ | ||
|
|
||
| `timescale 1ns / 1ns | ||
|
|
||
| module altera_avalon_st_pipeline_base ( | ||
| clk, | ||
| reset, | ||
| in_ready, | ||
| in_valid, | ||
| in_data, | ||
| out_ready, | ||
| out_valid, | ||
| out_data | ||
| ); | ||
|
|
||
| parameter SYMBOLS_PER_BEAT = 1; | ||
| parameter BITS_PER_SYMBOL = 8; | ||
| parameter PIPELINE_READY = 1; | ||
| localparam DATA_WIDTH = SYMBOLS_PER_BEAT * BITS_PER_SYMBOL; | ||
|
|
||
| input clk; | ||
| input reset; | ||
|
|
||
| output in_ready; | ||
| input in_valid; | ||
| input [DATA_WIDTH-1:0] in_data; | ||
|
|
||
| input out_ready; | ||
| output out_valid; | ||
| output [DATA_WIDTH-1:0] out_data; | ||
|
|
||
| reg full0; | ||
| reg full1; | ||
| reg [DATA_WIDTH-1:0] data0; | ||
| reg [DATA_WIDTH-1:0] data1; | ||
|
|
||
| assign out_valid = full1; | ||
| assign out_data = data1; | ||
|
|
||
| generate if (PIPELINE_READY == 1) | ||
| begin : REGISTERED_READY_PLINE | ||
|
|
||
| assign in_ready = !full0; | ||
|
|
||
| always @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| data0 <= {DATA_WIDTH{1'b0}}; | ||
| data1 <= {DATA_WIDTH{1'b0}}; | ||
| end else begin | ||
| // ---------------------------- | ||
| // always load the second slot if we can | ||
| // ---------------------------- | ||
| if (~full0) | ||
| data0 <= in_data; | ||
| // ---------------------------- | ||
| // first slot is loaded either from the second, | ||
| // or with new data | ||
| // ---------------------------- | ||
| if (~full1 || (out_ready && out_valid)) begin | ||
| if (full0) | ||
| data1 <= data0; | ||
| else | ||
| data1 <= in_data; | ||
| end | ||
| end | ||
| end | ||
|
|
||
| always @(posedge clk or posedge reset) begin | ||
| if (reset) begin | ||
| full0 <= 1'b0; | ||
| full1 <= 1'b0; | ||
| end else begin | ||
| // no data in pipeline | ||
| if (~full0 & ~full1) begin | ||
| if (in_valid) begin | ||
| full1 <= 1'b1; | ||
| end | ||
| end // ~f1 & ~f0 | ||
|
|
||
| // one datum in pipeline | ||
| if (full1 & ~full0) begin | ||
| if (in_valid & ~out_ready) begin | ||
| full0 <= 1'b1; | ||
| end | ||
| // back to empty | ||
| if (~in_valid & out_ready) begin | ||
| full1 <= 1'b0; | ||
| end | ||
| end // f1 & ~f0 | ||
|
|
||
| // two data in pipeline | ||
| if (full1 & full0) begin | ||
| // go back to one datum state | ||
| if (out_ready) begin | ||
| full0 <= 1'b0; | ||
| end | ||
| end // end go back to one datum stage | ||
| end | ||
| end | ||
|
|
||
| end | ||
| else | ||
| begin : UNREGISTERED_READY_PLINE | ||
|
|
||
| // in_ready will be a pass through of the out_ready signal as it is not registered | ||
| assign in_ready = (~full1) | out_ready; | ||
|
|
||
| always @(posedge clk or posedge reset) begin | ||
| if (reset) begin | ||
| data1 <= 'b0; | ||
| full1 <= 1'b0; | ||
| end | ||
| else begin | ||
| if (in_ready) begin | ||
| data1 <= in_data; | ||
| full1 <= in_valid; | ||
| end | ||
| end | ||
| end | ||
| end | ||
| endgenerate | ||
| endmodule |
| @@ -0,0 +1,166 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // $File: //acds/rel/15.1/ip/avalon_st/altera_avalon_st_pipeline_stage/altera_avalon_st_pipeline_stage.sv $ | ||
| // $Revision: #1 $ | ||
| // $Date: 2015/08/09 $ | ||
| // $Author: swbranch $ | ||
| //------------------------------------------------------------------------------ | ||
|
|
||
| `timescale 1ns / 1ns | ||
|
|
||
| module altera_avalon_st_pipeline_stage #( | ||
| parameter | ||
| SYMBOLS_PER_BEAT = 1, | ||
| BITS_PER_SYMBOL = 8, | ||
| USE_PACKETS = 0, | ||
| USE_EMPTY = 0, | ||
| PIPELINE_READY = 1, | ||
|
|
||
| // Optional ST signal widths. Value "0" means no such port. | ||
| CHANNEL_WIDTH = 0, | ||
| ERROR_WIDTH = 0, | ||
|
|
||
| // Derived parameters | ||
| DATA_WIDTH = SYMBOLS_PER_BEAT * BITS_PER_SYMBOL, | ||
| PACKET_WIDTH = 0, | ||
| EMPTY_WIDTH = 0 | ||
| ) | ||
| ( | ||
| input clk, | ||
| input reset, | ||
|
|
||
| output in_ready, | ||
| input in_valid, | ||
| input [DATA_WIDTH - 1 : 0] in_data, | ||
| input [(CHANNEL_WIDTH ? (CHANNEL_WIDTH - 1) : 0) : 0] in_channel, | ||
| input [(ERROR_WIDTH ? (ERROR_WIDTH - 1) : 0) : 0] in_error, | ||
| input in_startofpacket, | ||
| input in_endofpacket, | ||
| input [(EMPTY_WIDTH ? (EMPTY_WIDTH - 1) : 0) : 0] in_empty, | ||
|
|
||
| input out_ready, | ||
| output out_valid, | ||
| output [DATA_WIDTH - 1 : 0] out_data, | ||
| output [(CHANNEL_WIDTH ? (CHANNEL_WIDTH - 1) : 0) : 0] out_channel, | ||
| output [(ERROR_WIDTH ? (ERROR_WIDTH - 1) : 0) : 0] out_error, | ||
| output out_startofpacket, | ||
| output out_endofpacket, | ||
| output [(EMPTY_WIDTH ? (EMPTY_WIDTH - 1) : 0) : 0] out_empty | ||
| ); | ||
| localparam | ||
| PAYLOAD_WIDTH = | ||
| DATA_WIDTH + | ||
| PACKET_WIDTH + | ||
| CHANNEL_WIDTH + | ||
| EMPTY_WIDTH + | ||
| ERROR_WIDTH; | ||
|
|
||
| wire [PAYLOAD_WIDTH - 1: 0] in_payload; | ||
| wire [PAYLOAD_WIDTH - 1: 0] out_payload; | ||
|
|
||
| // Assign in_data and other optional in_* interface signals to in_payload. | ||
| assign in_payload[DATA_WIDTH - 1 : 0] = in_data; | ||
| generate | ||
| // optional packet inputs | ||
| if (PACKET_WIDTH) begin | ||
| assign in_payload[ | ||
| DATA_WIDTH + PACKET_WIDTH - 1 : | ||
| DATA_WIDTH | ||
| ] = {in_startofpacket, in_endofpacket}; | ||
| end | ||
| // optional channel input | ||
| if (CHANNEL_WIDTH) begin | ||
| assign in_payload[ | ||
| DATA_WIDTH + PACKET_WIDTH + CHANNEL_WIDTH - 1 : | ||
| DATA_WIDTH + PACKET_WIDTH | ||
| ] = in_channel; | ||
| end | ||
| // optional empty input | ||
| if (EMPTY_WIDTH) begin | ||
| assign in_payload[ | ||
| DATA_WIDTH + PACKET_WIDTH + CHANNEL_WIDTH + EMPTY_WIDTH - 1 : | ||
| DATA_WIDTH + PACKET_WIDTH + CHANNEL_WIDTH | ||
| ] = in_empty; | ||
| end | ||
| // optional error input | ||
| if (ERROR_WIDTH) begin | ||
| assign in_payload[ | ||
| DATA_WIDTH + PACKET_WIDTH + CHANNEL_WIDTH + EMPTY_WIDTH + ERROR_WIDTH - 1 : | ||
| DATA_WIDTH + PACKET_WIDTH + CHANNEL_WIDTH + EMPTY_WIDTH | ||
| ] = in_error; | ||
| end | ||
| endgenerate | ||
|
|
||
| altera_avalon_st_pipeline_base #( | ||
| .SYMBOLS_PER_BEAT (PAYLOAD_WIDTH), | ||
| .BITS_PER_SYMBOL (1), | ||
| .PIPELINE_READY (PIPELINE_READY) | ||
| ) core ( | ||
| .clk (clk), | ||
| .reset (reset), | ||
| .in_ready (in_ready), | ||
| .in_valid (in_valid), | ||
| .in_data (in_payload), | ||
| .out_ready (out_ready), | ||
| .out_valid (out_valid), | ||
| .out_data (out_payload) | ||
| ); | ||
|
|
||
| // Assign out_data and other optional out_* interface signals from out_payload. | ||
| assign out_data = out_payload[DATA_WIDTH - 1 : 0]; | ||
| generate | ||
| // optional packet outputs | ||
| if (PACKET_WIDTH) begin | ||
| assign {out_startofpacket, out_endofpacket} = | ||
| out_payload[DATA_WIDTH + PACKET_WIDTH - 1 : DATA_WIDTH]; | ||
| end else begin | ||
| // Avoid a "has no driver" warning. | ||
| assign {out_startofpacket, out_endofpacket} = 2'b0; | ||
| end | ||
|
|
||
| // optional channel output | ||
| if (CHANNEL_WIDTH) begin | ||
| assign out_channel = out_payload[ | ||
| DATA_WIDTH + PACKET_WIDTH + CHANNEL_WIDTH - 1 : | ||
| DATA_WIDTH + PACKET_WIDTH | ||
| ]; | ||
| end else begin | ||
| // Avoid a "has no driver" warning. | ||
| assign out_channel = 1'b0; | ||
| end | ||
| // optional empty output | ||
| if (EMPTY_WIDTH) begin | ||
| assign out_empty = out_payload[ | ||
| DATA_WIDTH + PACKET_WIDTH + CHANNEL_WIDTH + EMPTY_WIDTH - 1 : | ||
| DATA_WIDTH + PACKET_WIDTH + CHANNEL_WIDTH | ||
| ]; | ||
| end else begin | ||
| // Avoid a "has no driver" warning. | ||
| assign out_empty = 1'b0; | ||
| end | ||
| // optional error output | ||
| if (ERROR_WIDTH) begin | ||
| assign out_error = out_payload[ | ||
| DATA_WIDTH + PACKET_WIDTH + CHANNEL_WIDTH + EMPTY_WIDTH + ERROR_WIDTH - 1 : | ||
| DATA_WIDTH + PACKET_WIDTH + CHANNEL_WIDTH + EMPTY_WIDTH | ||
| ]; | ||
| end else begin | ||
| // Avoid a "has no driver" warning. | ||
| assign out_error = 1'b0; | ||
| end | ||
| endgenerate | ||
|
|
||
| endmodule | ||
|
|
||
|
|
| @@ -0,0 +1,189 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // $Id: //acds/rel/15.1/ip/merlin/altera_merlin_burst_adapter/new_source/altera_default_burst_converter.sv#1 $ | ||
| // $Revision: #1 $ | ||
| // $Date: 2015/08/09 $ | ||
| // $Author: swbranch $ | ||
|
|
||
| // -------------------------------------------- | ||
| // Default Burst Converter | ||
| // Notes: | ||
| // 1) If burst type FIXED and slave is AXI, | ||
| // passthrough the transaction. | ||
| // 2) Else, converts burst into non-bursting | ||
| // transactions (length of 1). | ||
| // -------------------------------------------- | ||
|
|
||
| `timescale 1 ns / 1 ns | ||
|
|
||
| module altera_default_burst_converter | ||
| #( | ||
| parameter PKT_BURST_TYPE_W = 2, | ||
| parameter PKT_BURSTWRAP_W = 5, | ||
| parameter PKT_ADDR_W = 12, | ||
| parameter PKT_BURST_SIZE_W = 3, | ||
| parameter IS_AXI_SLAVE = 0, | ||
| parameter LEN_W = 2 | ||
| ) | ||
| ( | ||
| input clk, | ||
| input reset, | ||
| input enable, | ||
|
|
||
| input [PKT_BURST_TYPE_W - 1 : 0] in_bursttype, | ||
| input [PKT_BURSTWRAP_W - 1 : 0] in_burstwrap_reg, | ||
| input [PKT_BURSTWRAP_W - 1 : 0] in_burstwrap_value, | ||
| input [PKT_ADDR_W - 1 : 0] in_addr, | ||
| input [PKT_ADDR_W - 1 : 0] in_addr_reg, | ||
| input [LEN_W - 1 : 0] in_len, | ||
| input [PKT_BURST_SIZE_W - 1 : 0] in_size_value, | ||
|
|
||
| input in_is_write, | ||
|
|
||
| output reg [PKT_ADDR_W - 1 : 0] out_addr, | ||
| output reg [LEN_W - 1 : 0] out_len, | ||
|
|
||
| output reg new_burst | ||
| ); | ||
|
|
||
| // --------------------------------------------------- | ||
| // AXI Burst Type Encoding | ||
| // --------------------------------------------------- | ||
| typedef enum bit [1:0] | ||
| { | ||
| FIXED = 2'b00, | ||
| INCR = 2'b01, | ||
| WRAP = 2'b10, | ||
| RESERVED = 2'b11 | ||
| } AxiBurstType; | ||
|
|
||
| // ------------------------------------------- | ||
| // Internal Signals | ||
| // ------------------------------------------- | ||
| wire [LEN_W - 1 : 0] unit_len = {{LEN_W - 1 {1'b0}}, 1'b1}; | ||
| reg [LEN_W - 1 : 0] next_len; | ||
| reg [LEN_W - 1 : 0] remaining_len; | ||
| reg [PKT_ADDR_W - 1 : 0] next_incr_addr; | ||
| reg [PKT_ADDR_W - 1 : 0] incr_wrapped_addr; | ||
| reg [PKT_ADDR_W - 1 : 0] extended_burstwrap_value; | ||
| reg [PKT_ADDR_W - 1 : 0] addr_incr_variable_size_value; | ||
|
|
||
| // ------------------------------------------- | ||
| // Byte Count Converter | ||
| // ------------------------------------------- | ||
| // Avalon Slave: Read/Write, the out_len is always 1 (unit_len). | ||
| // AXI Slave: Read/Write, the out_len is always the in_len (pass through) of a given cycle. | ||
| // If bursttype RESERVED, out_len is always 1 (unit_len). | ||
| generate if (IS_AXI_SLAVE == 1) | ||
| begin : axi_slave_out_len | ||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| out_len <= {LEN_W{1'b0}}; | ||
| end | ||
| else if (enable) begin | ||
| out_len <= (in_bursttype == FIXED) ? in_len : unit_len; | ||
| end | ||
| end | ||
| end | ||
| else // IS_AXI_SLAVE == 0 | ||
| begin : non_axi_slave_out_len | ||
| always_comb begin | ||
| out_len = unit_len; | ||
| end | ||
| end | ||
| endgenerate | ||
|
|
||
|
|
||
| always_comb begin : proc_extend_burstwrap | ||
| extended_burstwrap_value = {{(PKT_ADDR_W - PKT_BURSTWRAP_W){in_burstwrap_reg[PKT_BURSTWRAP_W - 1]}}, in_burstwrap_value}; | ||
| addr_incr_variable_size_value = {{(PKT_ADDR_W - 1){1'b0}}, 1'b1} << in_size_value; | ||
| end | ||
|
|
||
| // ------------------------------------------- | ||
| // Address Converter | ||
| // ------------------------------------------- | ||
| // Write: out_addr = in_addr at every cycle (pass through). | ||
| // Read: out_addr = in_addr at every new_burst. Subsequent addresses calculated by converter. | ||
|
|
||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| next_incr_addr <= {PKT_ADDR_W{1'b0}}; | ||
| out_addr <= {PKT_ADDR_W{1'b0}}; | ||
| end | ||
| else if (enable) begin | ||
| next_incr_addr <= next_incr_addr + addr_incr_variable_size_value; | ||
| if (new_burst) begin | ||
| next_incr_addr <= in_addr + addr_incr_variable_size_value; | ||
| end | ||
| out_addr <= incr_wrapped_addr; | ||
| end | ||
| end | ||
|
|
||
| always_comb begin | ||
| incr_wrapped_addr = in_addr; | ||
| if (!new_burst) begin | ||
| // This formula calculates addresses of WRAP bursts and works perfectly fine for other burst types too. | ||
| incr_wrapped_addr = (in_addr_reg & ~extended_burstwrap_value) | (next_incr_addr & extended_burstwrap_value); | ||
| end | ||
| end | ||
|
|
||
| // ------------------------------------------- | ||
| // Control Signals | ||
| // ------------------------------------------- | ||
|
|
||
| // Determine the min_len. | ||
| // 1) FIXED read to AXI slave: One-time passthrough, therefore the min_len == in_len. | ||
| // 2) FIXED write to AXI slave: min_len == 1. | ||
| // 3) FIXED read/write to Avalon slave: min_len == 1. | ||
| // 4) RESERVED read/write to AXI/Avalon slave: min_len == 1. | ||
| wire [LEN_W - 1 : 0] min_len; | ||
| generate if (IS_AXI_SLAVE == 1) | ||
| begin : axi_slave_min_len | ||
| assign min_len = (!in_is_write && (in_bursttype == FIXED)) ? in_len : unit_len; | ||
| end | ||
| else // IS_AXI_SLAVE == 0 | ||
| begin : non_axi_slave_min_len | ||
| assign min_len = unit_len; | ||
| end | ||
| endgenerate | ||
|
|
||
| // last_beat calculation. | ||
| wire last_beat = (remaining_len == min_len); | ||
|
|
||
| // next_len calculation. | ||
| always_comb begin | ||
| remaining_len = in_len; | ||
| if (!new_burst) remaining_len = next_len; | ||
| end | ||
|
|
||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| next_len <= 1'b0; | ||
| end | ||
| else if (enable) begin | ||
| next_len <= remaining_len - unit_len; | ||
| end | ||
| end | ||
|
|
||
| // new_burst calculation. | ||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| new_burst <= 1'b1; | ||
| end | ||
| else if (enable) begin | ||
| new_burst <= last_beat; | ||
| end | ||
| end | ||
|
|
||
| endmodule |
| @@ -0,0 +1,310 @@ | ||
| // (C) 2001-2015 Altera Corporation. All rights reserved. | ||
| // Your use of Altera Corporation's design tools, logic functions and other | ||
| // software and tools, and its AMPP partner logic functions, and any output | ||
| // files any of the foregoing (including device programming or simulation | ||
| // files), and any associated documentation or information are expressly subject | ||
| // to the terms and conditions of the Altera Program License Subscription | ||
| // Agreement, Altera MegaCore Function License Agreement, or other applicable | ||
| // license agreement, including, without limitation, that your use is for the | ||
| // sole purpose of programming logic devices manufactured by Altera and sold by | ||
| // Altera or its authorized distributors. Please refer to the applicable | ||
| // agreement for further details. | ||
|
|
||
|
|
||
| // $Id: //acds/rel/15.1/ip/merlin/altera_merlin_burst_adapter/new_source/altera_incr_burst_converter.sv#1 $ | ||
| // $Revision: #1 $ | ||
| // $Date: 2015/08/09 $ | ||
| // $Author: swbranch $ | ||
|
|
||
| // ---------------------------------------------------------- | ||
| // This component is used for INCR Avalon slave | ||
| // (slave which only supports INCR) or AXI slave. | ||
| // It converts burst length of input packet | ||
| // to match slave burst. | ||
| // ---------------------------------------------------------- | ||
|
|
||
| `timescale 1 ns / 1 ns | ||
|
|
||
| module altera_incr_burst_converter | ||
| #( | ||
| parameter | ||
| // ---------------------------------------- | ||
| // Burst length Parameters | ||
| // (real burst length value, not bytecount) | ||
| // ---------------------------------------- | ||
| MAX_IN_LEN = 16, | ||
| MAX_OUT_LEN = 4, | ||
| NUM_SYMBOLS = 4, | ||
| ADDR_WIDTH = 12, | ||
| BNDRY_WIDTH = 12, | ||
| BURSTSIZE_WIDTH = 3, | ||
| IN_NARROW_SIZE = 0, | ||
| PURELY_INCR_AVL_SYS = 0, | ||
| // ------------------ | ||
| // Derived Parameters | ||
| // ------------------ | ||
| LEN_WIDTH = log2ceil(MAX_IN_LEN) + 1, | ||
| OUT_LEN_WIDTH = log2ceil(MAX_OUT_LEN) + 1, | ||
| LOG2_NUMSYMBOLS = log2ceil(NUM_SYMBOLS) | ||
| ) | ||
| ( | ||
| input clk, | ||
| input reset, | ||
| input enable, | ||
|
|
||
| input is_write, | ||
| input [LEN_WIDTH - 1 : 0] in_len, | ||
| input in_sop, | ||
|
|
||
| input [ADDR_WIDTH - 1 : 0] in_addr, | ||
| input [ADDR_WIDTH - 1 : 0] in_addr_reg, | ||
| input [BNDRY_WIDTH - 1 : 0] in_burstwrap_reg, | ||
| input [BURSTSIZE_WIDTH - 1 : 0] in_size_t, | ||
| input [BURSTSIZE_WIDTH - 1 : 0] in_size_reg, | ||
|
|
||
| // converted output length | ||
| // out_len : compressed burst, read | ||
| // uncompressed_len: uncompressed, write | ||
| output reg [LEN_WIDTH - 1 : 0] out_len, | ||
| output reg [LEN_WIDTH - 1 : 0] uncompr_out_len, | ||
| // Compressed address output | ||
| output reg [ADDR_WIDTH - 1 : 0] out_addr, | ||
| output reg new_burst_export | ||
| ); | ||
|
|
||
| // ---------------------------------------- | ||
| // Signals for wrapping support | ||
| // ---------------------------------------- | ||
| reg [LEN_WIDTH - 1 : 0] remaining_len; | ||
| reg [LEN_WIDTH - 1 : 0] next_out_len; | ||
| reg [LEN_WIDTH - 1 : 0] next_rem_len; | ||
| reg [LEN_WIDTH - 1 : 0] uncompr_remaining_len; | ||
| reg [LEN_WIDTH - 1 : 0] next_uncompr_remaining_len; | ||
| reg [LEN_WIDTH - 1 : 0] next_uncompr_rem_len; | ||
| reg new_burst; | ||
| reg uncompr_sub_burst; | ||
|
|
||
| // Avoid QIS warning | ||
| wire [OUT_LEN_WIDTH - 1 : 0] max_out_length; | ||
| assign max_out_length = MAX_OUT_LEN[OUT_LEN_WIDTH - 1 : 0]; | ||
|
|
||
| always_comb begin | ||
| new_burst_export = new_burst; | ||
| end | ||
|
|
||
| // ------------------------------------------- | ||
| // length remaining calculation | ||
| // ------------------------------------------- | ||
|
|
||
| always_comb begin : proc_uncompressed_remaining_len | ||
| if ((in_len <= max_out_length) && is_write) begin | ||
| uncompr_remaining_len = in_len; | ||
| end else begin | ||
| uncompr_remaining_len = max_out_length; | ||
| end | ||
|
|
||
| if (uncompr_sub_burst) | ||
| uncompr_remaining_len = next_uncompr_rem_len; | ||
| end | ||
|
|
||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| next_uncompr_rem_len <= 0; | ||
| end | ||
| else if (enable) begin | ||
| next_uncompr_rem_len <= uncompr_remaining_len - 1'b1; // in term of length, it just reduces 1 | ||
| end | ||
| end | ||
|
|
||
| always_comb begin : proc_compressed_remaining_len | ||
| remaining_len = in_len; | ||
| if (!new_burst) | ||
| remaining_len = next_rem_len; | ||
| end | ||
|
|
||
| always_ff@(posedge clk or posedge reset) begin : proc_next_uncompressed_remaining_len | ||
| if(reset) begin | ||
| next_uncompr_remaining_len <= '0; | ||
| end | ||
| else if (enable) begin | ||
| if (in_sop) begin | ||
| next_uncompr_remaining_len <= in_len - max_out_length; | ||
| end | ||
| else if (!uncompr_sub_burst) | ||
| next_uncompr_remaining_len <= next_uncompr_remaining_len - max_out_length; | ||
| end | ||
| end | ||
|
|
||
| always_comb begin | ||
| next_out_len = max_out_length; | ||
| if (remaining_len < max_out_length) begin | ||
| next_out_len = remaining_len; | ||
| end | ||
| end // always_comb | ||
|
|
||
| // -------------------------------------------------- | ||
| // Length remaining calculation : compressed | ||
| // -------------------------------------------------- | ||
| // length remaining for compressed transaction | ||
| // for wrap, need special handling for first out length | ||
|
|
||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) | ||
| next_rem_len <= 0; | ||
| else if (enable) begin | ||
| if (new_burst) | ||
| next_rem_len <= in_len - max_out_length; | ||
| else | ||
| next_rem_len <= next_rem_len - max_out_length; | ||
| end | ||
| end | ||
|
|
||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| uncompr_sub_burst <= 0; | ||
| end | ||
| else if (enable && is_write) begin | ||
| uncompr_sub_burst <= (uncompr_remaining_len > 1'b1); | ||
| end | ||
| end | ||
|
|
||
|
|
||
| // -------------------------------------------------- | ||
| // Control signals | ||
| // -------------------------------------------------- | ||
| wire end_compressed_sub_burst; | ||
| assign end_compressed_sub_burst = (remaining_len == next_out_len); | ||
|
|
||
| // new_burst: | ||
| // the converter takes in_len for new calculation | ||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) | ||
| new_burst <= 1; | ||
| else if (enable) | ||
| new_burst <= end_compressed_sub_burst; | ||
| end | ||
|
|
||
| // -------------------------------------------------- | ||
| // Output length | ||
| // -------------------------------------------------- | ||
| // register out_len for compressed trans | ||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| out_len <= 0; | ||
| end | ||
| else if (enable) begin | ||
| out_len <= next_out_len; | ||
| end | ||
| end | ||
|
|
||
| // register uncompr_out_len for uncompressed trans | ||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| uncompr_out_len <= '0; | ||
| end | ||
| else if (enable) begin | ||
| uncompr_out_len <= uncompr_remaining_len; | ||
| end | ||
| end | ||
|
|
||
| // -------------------------------------------------- | ||
| // Address Calculation | ||
| // -------------------------------------------------- | ||
| reg [ADDR_WIDTH - 1 : 0] addr_incr_sel; | ||
| reg [ADDR_WIDTH - 1 : 0] addr_incr_sel_reg; | ||
| reg [ADDR_WIDTH - 1 : 0] addr_incr_full_size; | ||
|
|
||
| localparam [ADDR_WIDTH - 1 : 0] ADDR_INCR = MAX_OUT_LEN << LOG2_NUMSYMBOLS; | ||
|
|
||
| generate | ||
| if (IN_NARROW_SIZE) begin : narrow_addr_incr | ||
| reg [ADDR_WIDTH - 1 : 0] addr_incr_variable_size; | ||
| reg [ADDR_WIDTH - 1 : 0] addr_incr_variable_size_reg; | ||
|
|
||
| assign addr_incr_variable_size = MAX_OUT_LEN << in_size_t; | ||
| assign addr_incr_variable_size_reg = MAX_OUT_LEN << in_size_reg; | ||
|
|
||
| assign addr_incr_sel = addr_incr_variable_size; | ||
| assign addr_incr_sel_reg = addr_incr_variable_size_reg; | ||
| end | ||
| else begin : full_addr_incr | ||
| assign addr_incr_full_size = ADDR_INCR[ADDR_WIDTH - 1 : 0]; | ||
| assign addr_incr_sel = addr_incr_full_size; | ||
| assign addr_incr_sel_reg = addr_incr_full_size; | ||
| end | ||
| endgenerate | ||
|
|
||
|
|
||
| reg [ADDR_WIDTH - 1 : 0] next_out_addr; | ||
| reg [ADDR_WIDTH - 1 : 0] incremented_addr; | ||
|
|
||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| out_addr <= '0; | ||
| end else begin | ||
| if (enable) begin | ||
| out_addr <= (next_out_addr); | ||
| end | ||
| end | ||
| end | ||
|
|
||
| generate | ||
| if (!PURELY_INCR_AVL_SYS) begin : incremented_addr_normal | ||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| incremented_addr <= '0; | ||
| end | ||
| else if (enable) begin | ||
| incremented_addr <= (next_out_addr + addr_incr_sel_reg); | ||
| if (new_burst) begin | ||
| incremented_addr <= (next_out_addr + addr_incr_sel); | ||
| end | ||
| end | ||
| end // always_ff @ | ||
|
|
||
| always_comb begin | ||
| next_out_addr = in_addr; | ||
| if (!new_burst) begin | ||
| next_out_addr = incremented_addr; | ||
| end | ||
| end | ||
| end | ||
| else begin : incremented_addr_pure_av | ||
| always_ff @(posedge clk, posedge reset) begin | ||
| if (reset) begin | ||
| incremented_addr <= '0; | ||
| end | ||
| else if (enable) begin | ||
| incremented_addr <= (next_out_addr + addr_incr_sel_reg); | ||
| end | ||
| end // always_ff @ | ||
|
|
||
| always_comb begin | ||
| next_out_addr = in_addr; | ||
| if (!new_burst) begin | ||
| next_out_addr = (incremented_addr); | ||
| end | ||
| end | ||
|
|
||
| end | ||
| endgenerate | ||
|
|
||
| // -------------------------------------------------- | ||
| // Calculates the log2ceil of the input value | ||
| // -------------------------------------------------- | ||
| function integer log2ceil; | ||
| input integer val; | ||
| reg[31:0] i; | ||
|
|
||
| begin | ||
| i = 1; | ||
| log2ceil = 0; | ||
|
|
||
| while (i < val) begin | ||
| log2ceil = log2ceil + 1; | ||
| i = i[30:0] << 1; | ||
| end | ||
| end | ||
| endfunction | ||
|
|
||
| endmodule |