* Add modelsim.ini File in gitignore
* Small change in rtps_builtin_endpoint_test1 - Empty Signal was not toggling * Added rtps_builtin_endpoint_test2 - Compiling and Passing * Update rtps_test_package * Various bug Fixes in rtps_builtin_endpoint
This commit is contained in:
parent
521e2466f5
commit
32fd1ac31e
2
.gitignore
vendored
2
.gitignore
vendored
@ -14,6 +14,8 @@
|
|||||||
#***MODELSIM***
|
#***MODELSIM***
|
||||||
#Do files
|
#Do files
|
||||||
!*.do
|
!*.do
|
||||||
|
#Modelsim INI File
|
||||||
|
!*modelsim.ini
|
||||||
#***QUARTUS***
|
#***QUARTUS***
|
||||||
#Project File
|
#Project File
|
||||||
!*.qpf
|
!*.qpf
|
||||||
|
|||||||
326
sim/modelsim.ini
Normal file
326
sim/modelsim.ini
Normal file
@ -0,0 +1,326 @@
|
|||||||
|
; Copyright 1991-2009 Mentor Graphics Corporation
|
||||||
|
;
|
||||||
|
; All Rights Reserved.
|
||||||
|
;
|
||||||
|
; THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS THE PROPERTY OF
|
||||||
|
; MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS.
|
||||||
|
;
|
||||||
|
|
||||||
|
[Library]
|
||||||
|
others = $MODEL_TECH/../modelsim.ini
|
||||||
|
|
||||||
|
; Altera Primitive libraries
|
||||||
|
;
|
||||||
|
; VHDL Section
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Verilog Section
|
||||||
|
;
|
||||||
|
|
||||||
|
default = W:/HDL-SIM/OSVVM-Scripts/../sim/VHDL_LIBS/ModelSim-2020.02/default.lib
|
||||||
|
osvvm = W:/HDL-SIM/OSVVM-Scripts/../sim/VHDL_LIBS/ModelSim-2020.02/osvvm.lib
|
||||||
|
Level0-rtps_handler = W:/HDL-SIM/OSVVM-Scripts/../sim/VHDL_LIBS/ModelSim-2020.02/Level0-rtps_handler.lib
|
||||||
|
[vcom]
|
||||||
|
; VHDL93 variable selects language version as the default.
|
||||||
|
; Default is VHDL-2002.
|
||||||
|
; Value of 0 or 1987 for VHDL-1987.
|
||||||
|
; Value of 1 or 1993 for VHDL-1993.
|
||||||
|
; Default or value of 2 or 2002 for VHDL-2002.
|
||||||
|
; Default or value of 3 or 2008 for VHDL-2008.
|
||||||
|
VHDL93 = 2008
|
||||||
|
|
||||||
|
; Show source line containing error. Default is off.
|
||||||
|
; Show_source = 1
|
||||||
|
|
||||||
|
; Turn off unbound-component warnings. Default is on.
|
||||||
|
; Show_Warning1 = 0
|
||||||
|
|
||||||
|
; Turn off process-without-a-wait-statement warnings. Default is on.
|
||||||
|
; Show_Warning2 = 0
|
||||||
|
|
||||||
|
; Turn off null-range warnings. Default is on.
|
||||||
|
; Show_Warning3 = 0
|
||||||
|
|
||||||
|
; Turn off no-space-in-time-literal warnings. Default is on.
|
||||||
|
; Show_Warning4 = 0
|
||||||
|
|
||||||
|
; Turn off multiple-drivers-on-unresolved-signal warnings. Default is on.
|
||||||
|
; Show_Warning5 = 0
|
||||||
|
|
||||||
|
; Turn off optimization for IEEE std_logic_1164 package. Default is on.
|
||||||
|
; Optimize_1164 = 0
|
||||||
|
|
||||||
|
; Turn on resolving of ambiguous function overloading in favor of the
|
||||||
|
; "explicit" function declaration (not the one automatically created by
|
||||||
|
; the compiler for each type declaration). Default is off.
|
||||||
|
; The .ini file has Explicit enabled so that std_logic_signed/unsigned
|
||||||
|
; will match the behavior of synthesis tools.
|
||||||
|
Explicit = 1
|
||||||
|
|
||||||
|
; Turn off acceleration of the VITAL packages. Default is to accelerate.
|
||||||
|
; NoVital = 1
|
||||||
|
|
||||||
|
; Turn off VITAL compliance checking. Default is checking on.
|
||||||
|
; NoVitalCheck = 1
|
||||||
|
|
||||||
|
; Ignore VITAL compliance checking errors. Default is to not ignore.
|
||||||
|
; IgnoreVitalErrors = 1
|
||||||
|
|
||||||
|
; Turn off VITAL compliance checking warnings. Default is to show warnings.
|
||||||
|
; Show_VitalChecksWarnings = 0
|
||||||
|
|
||||||
|
; Keep silent about case statement static warnings.
|
||||||
|
; Default is to give a warning.
|
||||||
|
; NoCaseStaticError = 1
|
||||||
|
|
||||||
|
; Keep silent about warnings caused by aggregates that are not locally static.
|
||||||
|
; Default is to give a warning.
|
||||||
|
; NoOthersStaticError = 1
|
||||||
|
|
||||||
|
; Turn off inclusion of debugging info within design units.
|
||||||
|
; Default is to include debugging info.
|
||||||
|
; NoDebug = 1
|
||||||
|
|
||||||
|
; Turn off "Loading..." messages. Default is messages on.
|
||||||
|
; Quiet = 1
|
||||||
|
|
||||||
|
; Turn on some limited synthesis rule compliance checking. Checks only:
|
||||||
|
; -- signals used (read) by a process must be in the sensitivity list
|
||||||
|
; CheckSynthesis = 1
|
||||||
|
|
||||||
|
; Activate optimizations on expressions that do not involve signals,
|
||||||
|
; waits, or function/procedure/task invocations. Default is off.
|
||||||
|
; ScalarOpts = 1
|
||||||
|
|
||||||
|
; Require the user to specify a configuration for all bindings,
|
||||||
|
; and do not generate a compile time default binding for the
|
||||||
|
; component. This will result in an elaboration error of
|
||||||
|
; 'component not bound' if the user fails to do so. Avoids the rare
|
||||||
|
; issue of a false dependency upon the unused default binding.
|
||||||
|
; RequireConfigForAllDefaultBinding = 1
|
||||||
|
|
||||||
|
; Inhibit range checking on subscripts of arrays. Range checking on
|
||||||
|
; scalars defined with subtypes is inhibited by default.
|
||||||
|
; NoIndexCheck = 1
|
||||||
|
|
||||||
|
; Inhibit range checks on all (implicit and explicit) assignments to
|
||||||
|
; scalar objects defined with subtypes.
|
||||||
|
NoRangeCheck = 1
|
||||||
|
|
||||||
|
[vlog]
|
||||||
|
|
||||||
|
; Turn off inclusion of debugging info within design units.
|
||||||
|
; Default is to include debugging info.
|
||||||
|
; NoDebug = 1
|
||||||
|
|
||||||
|
; Turn off "loading..." messages. Default is messages on.
|
||||||
|
; Quiet = 1
|
||||||
|
|
||||||
|
; Turn on Verilog hazard checking (order-dependent accessing of global vars).
|
||||||
|
; Default is off.
|
||||||
|
; Hazard = 1
|
||||||
|
|
||||||
|
; Turn on converting regular Verilog identifiers to uppercase. Allows case
|
||||||
|
; insensitivity for module names. Default is no conversion.
|
||||||
|
; UpCase = 1
|
||||||
|
|
||||||
|
; Turn on incremental compilation of modules. Default is off.
|
||||||
|
; Incremental = 1
|
||||||
|
|
||||||
|
; Turns on lint-style checking.
|
||||||
|
; Show_Lint = 1
|
||||||
|
|
||||||
|
[vsim]
|
||||||
|
; Simulator resolution
|
||||||
|
; Set to fs, ps, ns, us, ms, or sec with optional prefix of 1, 10, or 100.
|
||||||
|
Resolution = ns
|
||||||
|
|
||||||
|
; User time unit for run commands
|
||||||
|
; Set to default, fs, ps, ns, us, ms, or sec. The default is to use the
|
||||||
|
; unit specified for Resolution. For example, if Resolution is 100ps,
|
||||||
|
; then UserTimeUnit defaults to ps.
|
||||||
|
; Should generally be set to default.
|
||||||
|
UserTimeUnit = default
|
||||||
|
|
||||||
|
; Default run length
|
||||||
|
RunLength = 100
|
||||||
|
|
||||||
|
; Maximum iterations that can be run without advancing simulation time
|
||||||
|
IterationLimit = 5000
|
||||||
|
|
||||||
|
; Directive to license manager:
|
||||||
|
; vhdl Immediately reserve a VHDL license
|
||||||
|
; vlog Immediately reserve a Verilog license
|
||||||
|
; plus Immediately reserve a VHDL and Verilog license
|
||||||
|
; nomgc Do not look for Mentor Graphics Licenses
|
||||||
|
; nomti Do not look for Model Technology Licenses
|
||||||
|
; noqueue Do not wait in the license queue when a license isn't available
|
||||||
|
; viewsim Try for viewer license but accept simulator license(s) instead
|
||||||
|
; of queuing for viewer license
|
||||||
|
; License = plus
|
||||||
|
|
||||||
|
; Stop the simulator after a VHDL/Verilog assertion message
|
||||||
|
; 0 = Note 1 = Warning 2 = Error 3 = Failure 4 = Fatal
|
||||||
|
BreakOnAssertion = 3
|
||||||
|
|
||||||
|
; Assertion Message Format
|
||||||
|
; %S - Severity Level
|
||||||
|
; %R - Report Message
|
||||||
|
; %T - Time of assertion
|
||||||
|
; %D - Delta
|
||||||
|
; %I - Instance or Region pathname (if available)
|
||||||
|
; %% - print '%' character
|
||||||
|
; AssertionFormat = "** %S: %R\n Time: %T Iteration: %D%I\n"
|
||||||
|
|
||||||
|
; Assertion File - alternate file for storing VHDL/Verilog assertion messages
|
||||||
|
; AssertFile = assert.log
|
||||||
|
|
||||||
|
; Default radix for all windows and commands...
|
||||||
|
; Set to symbolic, ascii, binary, octal, decimal, hex, unsigned
|
||||||
|
DefaultRadix = symbolic
|
||||||
|
|
||||||
|
; VSIM Startup command
|
||||||
|
; Startup = do startup.do
|
||||||
|
|
||||||
|
; File for saving command transcript
|
||||||
|
TranscriptFile = transcript
|
||||||
|
|
||||||
|
; File for saving command history
|
||||||
|
; CommandHistory = cmdhist.log
|
||||||
|
|
||||||
|
; Specify whether paths in simulator commands should be described
|
||||||
|
; in VHDL or Verilog format.
|
||||||
|
; For VHDL, PathSeparator = /
|
||||||
|
; For Verilog, PathSeparator = .
|
||||||
|
; Must not be the same character as DatasetSeparator.
|
||||||
|
PathSeparator = /
|
||||||
|
|
||||||
|
; Specify the dataset separator for fully rooted contexts.
|
||||||
|
; The default is ':'. For example, sim:/top
|
||||||
|
; Must not be the same character as PathSeparator.
|
||||||
|
DatasetSeparator = :
|
||||||
|
|
||||||
|
; Disable VHDL assertion messages
|
||||||
|
; IgnoreNote = 1
|
||||||
|
; IgnoreWarning = 1
|
||||||
|
; IgnoreError = 1
|
||||||
|
; IgnoreFailure = 1
|
||||||
|
|
||||||
|
; Default force kind. May be freeze, drive, deposit, or default
|
||||||
|
; or in other terms, fixed, wired, or charged.
|
||||||
|
; A value of "default" will use the signal kind to determine the
|
||||||
|
; force kind, drive for resolved signals, freeze for unresolved signals
|
||||||
|
; DefaultForceKind = freeze
|
||||||
|
|
||||||
|
; If zero, open files when elaborated; otherwise, open files on
|
||||||
|
; first read or write. Default is 0.
|
||||||
|
; DelayFileOpen = 1
|
||||||
|
|
||||||
|
; Control VHDL files opened for write.
|
||||||
|
; 0 = Buffered, 1 = Unbuffered
|
||||||
|
UnbufferedOutput = 0
|
||||||
|
|
||||||
|
; Control the number of VHDL files open concurrently.
|
||||||
|
; This number should always be less than the current ulimit
|
||||||
|
; setting for max file descriptors.
|
||||||
|
; 0 = unlimited
|
||||||
|
ConcurrentFileLimit = 40
|
||||||
|
|
||||||
|
; Control the number of hierarchical regions displayed as
|
||||||
|
; part of a signal name shown in the Wave window.
|
||||||
|
; A value of zero tells VSIM to display the full name.
|
||||||
|
; The default is 0.
|
||||||
|
; WaveSignalNameWidth = 0
|
||||||
|
|
||||||
|
; Turn off warnings from the std_logic_arith, std_logic_unsigned
|
||||||
|
; and std_logic_signed packages.
|
||||||
|
; StdArithNoWarnings = 1
|
||||||
|
|
||||||
|
; Turn off warnings from the IEEE numeric_std and numeric_bit packages.
|
||||||
|
; NumericStdNoWarnings = 1
|
||||||
|
|
||||||
|
; Control the format of the (VHDL) FOR generate statement label
|
||||||
|
; for each iteration. Do not quote it.
|
||||||
|
; The format string here must contain the conversion codes %s and %d,
|
||||||
|
; in that order, and no other conversion codes. The %s represents
|
||||||
|
; the generate_label; the %d represents the generate parameter value
|
||||||
|
; at a particular generate iteration (this is the position number if
|
||||||
|
; the generate parameter is of an enumeration type). Embedded whitespace
|
||||||
|
; is allowed (but discouraged); leading and trailing whitespace is ignored.
|
||||||
|
; Application of the format must result in a unique scope name over all
|
||||||
|
; such names in the design so that name lookup can function properly.
|
||||||
|
; GenerateFormat = %s__%d
|
||||||
|
|
||||||
|
; Specify whether checkpoint files should be compressed.
|
||||||
|
; The default is 1 (compressed).
|
||||||
|
; CheckpointCompressMode = 0
|
||||||
|
|
||||||
|
; List of dynamically loaded objects for Verilog PLI applications
|
||||||
|
; Veriuser = veriuser.sl
|
||||||
|
|
||||||
|
; Specify default options for the restart command. Options can be one
|
||||||
|
; or more of: -force -nobreakpoint -nolist -nolog -nowave
|
||||||
|
; DefaultRestartOptions = -force
|
||||||
|
|
||||||
|
; HP-UX 10.20 ONLY - Enable memory locking to speed up large designs
|
||||||
|
; (> 500 megabyte memory footprint). Default is disabled.
|
||||||
|
; Specify number of megabytes to lock.
|
||||||
|
; LockedMemory = 1000
|
||||||
|
|
||||||
|
; Turn on (1) or off (0) WLF file compression.
|
||||||
|
; The default is 1 (compress WLF file).
|
||||||
|
; WLFCompress = 0
|
||||||
|
|
||||||
|
; Specify whether to save all design hierarchy (1) in the WLF file
|
||||||
|
; or only regions containing logged signals (0).
|
||||||
|
; The default is 0 (save only regions with logged signals).
|
||||||
|
; WLFSaveAllRegions = 1
|
||||||
|
|
||||||
|
; WLF file time limit. Limit WLF file by time, as closely as possible,
|
||||||
|
; to the specified amount of simulation time. When the limit is exceeded
|
||||||
|
; the earliest times get truncated from the file.
|
||||||
|
; If both time and size limits are specified the most restrictive is used.
|
||||||
|
; UserTimeUnits are used if time units are not specified.
|
||||||
|
; The default is 0 (no limit). Example: WLFTimeLimit = {100 ms}
|
||||||
|
; WLFTimeLimit = 0
|
||||||
|
|
||||||
|
; WLF file size limit. Limit WLF file size, as closely as possible,
|
||||||
|
; to the specified number of megabytes. If both time and size limits
|
||||||
|
; are specified then the most restrictive is used.
|
||||||
|
; The default is 0 (no limit).
|
||||||
|
; WLFSizeLimit = 1000
|
||||||
|
|
||||||
|
; Specify whether or not a WLF file should be deleted when the
|
||||||
|
; simulation ends. A value of 1 will cause the WLF file to be deleted.
|
||||||
|
; The default is 0 (do not delete WLF file when simulation ends).
|
||||||
|
; WLFDeleteOnQuit = 1
|
||||||
|
|
||||||
|
; Automatic SDF compilation
|
||||||
|
; Disables automatic compilation of SDF files in flows that support it.
|
||||||
|
; Default is on, uncomment to turn off.
|
||||||
|
; NoAutoSDFCompile = 1
|
||||||
|
|
||||||
|
[lmc]
|
||||||
|
|
||||||
|
[msg_system]
|
||||||
|
; Change a message severity or suppress a message.
|
||||||
|
; The format is: <msg directive> = <msg number>[,<msg number>...]
|
||||||
|
; Examples:
|
||||||
|
; note = 3009
|
||||||
|
; warning = 3033
|
||||||
|
; error = 3010,3016
|
||||||
|
; fatal = 3016,3033
|
||||||
|
; suppress = 3009,3016,3043
|
||||||
|
; The command verror <msg number> can be used to get the complete
|
||||||
|
; description of a message.
|
||||||
|
|
||||||
|
; Control transcripting of elaboration/runtime messages.
|
||||||
|
; The default is to have messages appear in the transcript and
|
||||||
|
; recorded in the wlf file (messages that are recorded in the
|
||||||
|
; wlf file can be viewed in the MsgViewer). The other settings
|
||||||
|
; are to send messages only to the transcript or only to the
|
||||||
|
; wlf file. The valid values are
|
||||||
|
; both {default}
|
||||||
|
; tran {transcript only}
|
||||||
|
; wlf {wlf file only}
|
||||||
|
; msgmode = both
|
||||||
72
sim/rtps_builtin_endpoint_test2.do
Normal file
72
sim/rtps_builtin_endpoint_test2.do
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
onerror {resume}
|
||||||
|
quietly WaveActivateNextPane {} 0
|
||||||
|
add wave -noupdate -divider SYSTEM
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/clk
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/reset
|
||||||
|
add wave -noupdate -divider INPUT
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/empty
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/rd
|
||||||
|
add wave -noupdate -radix hexadecimal /rtps_builtin_endpoint_test2/uut/data_in
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/last_word_in
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/last_word_in_latch
|
||||||
|
add wave -noupdate -divider OUTPUT
|
||||||
|
add wave -noupdate -radix hexadecimal /rtps_builtin_endpoint_test2/uut/data_out
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/endpoint_wr
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/last_word_out
|
||||||
|
add wave -noupdate -divider TESTBENCH
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/start
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/stim_stage
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/stimulus.length
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/cnt_stim
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/packet_sent
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/SB.ItemNumberVar
|
||||||
|
add wave -noupdate -divider {MAIN FSM}
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/stage
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/stage_next
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/cnt
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/endpoint_mask
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/participant_match
|
||||||
|
add wave -noupdate -divider {MEM FSM}
|
||||||
|
add wave -noupdate -group MEM_FSM /rtps_builtin_endpoint_test2/uut/mem_opcode
|
||||||
|
add wave -noupdate -group MEM_FSM /rtps_builtin_endpoint_test2/uut/mem_op_start
|
||||||
|
add wave -noupdate -group MEM_FSM /rtps_builtin_endpoint_test2/uut/mem_op_done
|
||||||
|
add wave -noupdate -group MEM_FSM /rtps_builtin_endpoint_test2/uut/mem_stage
|
||||||
|
add wave -noupdate -group MEM_FSM /rtps_builtin_endpoint_test2/uut/mem_stage_next
|
||||||
|
add wave -noupdate -group MEM_FSM /rtps_builtin_endpoint_test2/uut/mem_cnt
|
||||||
|
add wave -noupdate -group MEM_FSM -radix unsigned /rtps_builtin_endpoint_test2/uut/mem_addr_base
|
||||||
|
add wave -noupdate -group MEM_FSM -radix unsigned /rtps_builtin_endpoint_test2/uut/addr_res
|
||||||
|
add wave -noupdate -group MEM_FSM -radix unsigned /rtps_builtin_endpoint_test2/uut/last_addr
|
||||||
|
add wave -noupdate -group MEM_FSM -radix unsigned /rtps_builtin_endpoint_test2/uut/max_participant_addr
|
||||||
|
add wave -noupdate -group MEM_FSM -radix unsigned /rtps_builtin_endpoint_test2/uut/max_endpoint_addr
|
||||||
|
add wave -noupdate -divider GUARD
|
||||||
|
add wave -noupdate -radix unsigned /rtps_builtin_endpoint_test2/uut/read_cnt
|
||||||
|
add wave -noupdate -radix unsigned /rtps_builtin_endpoint_test2/uut/parameter_end
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/parse_prc/rd_guard
|
||||||
|
add wave -noupdate -divider MEMORY
|
||||||
|
add wave -noupdate -group MEMORY -radix unsigned /rtps_builtin_endpoint_test2/uut/ram_inst/addr
|
||||||
|
add wave -noupdate -group MEMORY /rtps_builtin_endpoint_test2/uut/ram_inst/wen
|
||||||
|
add wave -noupdate -group MEMORY /rtps_builtin_endpoint_test2/uut/ram_inst/ren
|
||||||
|
add wave -noupdate -group MEMORY -radix hexadecimal /rtps_builtin_endpoint_test2/uut/ram_inst/wr_data
|
||||||
|
add wave -noupdate -group MEMORY -radix hexadecimal /rtps_builtin_endpoint_test2/uut/ram_inst/rd_data
|
||||||
|
add wave -noupdate -divider MISC
|
||||||
|
add wave -noupdate /rtps_builtin_endpoint_test2/uut/update_participant_flags
|
||||||
|
add wave -noupdate -radix unsigned /rtps_builtin_endpoint_test2/uut/mem_seq_nr
|
||||||
|
add wave -noupdate -radix unsigned /rtps_builtin_endpoint_test2/uut/seq_nr
|
||||||
|
TreeUpdate [SetDefaultTree]
|
||||||
|
WaveRestoreCursors {Begin {32125000 ps} 1} {Error {35025000 ps} 1} {Cursor {33675000 ps} 0}
|
||||||
|
quietly wave cursor active 3
|
||||||
|
configure wave -namecolwidth 149
|
||||||
|
configure wave -valuecolwidth 144
|
||||||
|
configure wave -justifyvalue left
|
||||||
|
configure wave -signalnamewidth 1
|
||||||
|
configure wave -snapdistance 10
|
||||||
|
configure wave -datasetprefix 0
|
||||||
|
configure wave -rowmargin 4
|
||||||
|
configure wave -childrowmargin 2
|
||||||
|
configure wave -gridoffset 0
|
||||||
|
configure wave -gridperiod 1
|
||||||
|
configure wave -griddelta 40
|
||||||
|
configure wave -timeline 0
|
||||||
|
configure wave -timelineunits ns
|
||||||
|
update
|
||||||
|
WaveRestoreZoom {33245026 ps} {34393368 ps}
|
||||||
46
src/REF.txt
46
src/REF.txt
@ -227,15 +227,15 @@ ENDPOINT DATA
|
|||||||
31............24..............16..............8...............0
|
31............24..............16..............8...............0
|
||||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
01| ENTITYID |
|
00| ENTITYID |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
02| |
|
01| |
|
||||||
+ +
|
+ +
|
||||||
03| GUIDPREFIX |
|
02| GUIDPREFIX |
|
||||||
+ +
|
+ +
|
||||||
|
03| |
|
||||||
|
+-------------------------------------------------------------+
|
||||||
04| |
|
04| |
|
||||||
+-------------------------------------------------------------+
|
|
||||||
05| |
|
|
||||||
~ ENDPOINT_BITMASK ~
|
~ ENDPOINT_BITMASK ~
|
||||||
**| |
|
**| |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
@ -245,19 +245,19 @@ ENDPOINT MATCH FRAME
|
|||||||
31............24..............16..............8...............0
|
31............24..............16..............8...............0
|
||||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
01| OPCODE |
|
00| OPCODE |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
02| |
|
01| |
|
||||||
+ +
|
+ +
|
||||||
03| GUIDPREFIX |
|
02| GUIDPREFIX |
|
||||||
+ +
|
+ +
|
||||||
04| |
|
03| |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
05| ENTITYID |
|
04| ENTITYID |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
06| IPv4_ADDRESS |
|
05| IPv4_ADDRESS |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
07| UDP_PORT | UNUSED |Q|
|
06| UDP_PORT | UNUSED |Q|
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
|
|
||||||
ENDPOINT UNMATCH FRAME
|
ENDPOINT UNMATCH FRAME
|
||||||
@ -265,15 +265,15 @@ ENDPOINT UNMATCH FRAME
|
|||||||
31............24..............16..............8...............0
|
31............24..............16..............8...............0
|
||||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
01| OPCODE |
|
00| OPCODE |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
02| |
|
01| |
|
||||||
+ +
|
+ +
|
||||||
03| GUIDPREFIX |
|
02| GUIDPREFIX |
|
||||||
+ +
|
+ +
|
||||||
04| |
|
03| |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
05| ENTITYID |
|
04| ENTITYID |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
|
|
||||||
ENDPOINT LIVELINESS UPDATE
|
ENDPOINT LIVELINESS UPDATE
|
||||||
@ -281,13 +281,13 @@ ENDPOINT LIVELINESS UPDATE
|
|||||||
31............24..............16..............8...............0
|
31............24..............16..............8...............0
|
||||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
01| OPCODE |
|
00| OPCODE |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
02| |
|
01| |
|
||||||
+ +
|
+ +
|
||||||
03| GUIDPREFIX |
|
02| GUIDPREFIX |
|
||||||
+ +
|
+ +
|
||||||
04| |
|
03| |
|
||||||
+-------------------------------------------------------------+
|
+-------------------------------------------------------------+
|
||||||
|
|
||||||
LOCAL ENDPOINT BUFFER
|
LOCAL ENDPOINT BUFFER
|
||||||
@ -368,7 +368,9 @@ information is not present, the implementation can assume the default values, as
|
|||||||
In order to implement the DDS_BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS policy,
|
In order to implement the DDS_BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS policy,
|
||||||
implementations must include an InfoTimestamp Submessage with every update from a Writer.
|
implementations must include an InfoTimestamp Submessage with every update from a Writer.
|
||||||
|
|
||||||
|
9.4.2.11
|
||||||
|
The ParameterList may contain multiple Parameters with the same value for the parameterId.
|
||||||
|
This is used to provide a collection of values for that kind of Parameter.
|
||||||
|
|
||||||
DDS_Advanced_Tutorial_2006_00-T1-2_Pardo.pdf (P.16)
|
DDS_Advanced_Tutorial_2006_00-T1-2_Pardo.pdf (P.16)
|
||||||
|
|
||||||
|
|||||||
@ -54,7 +54,6 @@
|
|||||||
* Can we make an array of records of uncontrained strings? That we we could make an array of variable sized strings...
|
* Can we make an array of records of uncontrained strings? That we we could make an array of variable sized strings...
|
||||||
* Should I also check for Minor_Version >= 4?
|
* Should I also check for Minor_Version >= 4?
|
||||||
|
|
||||||
|
|
||||||
* Fast-RTPS doen not follow DDSI-RTPS Specification
|
* Fast-RTPS doen not follow DDSI-RTPS Specification
|
||||||
- Open Github Issue
|
- Open Github Issue
|
||||||
https://github.com/eProsima/Fast-RTPS/issues/1221
|
https://github.com/eProsima/Fast-RTPS/issues/1221
|
||||||
@ -75,7 +74,6 @@
|
|||||||
'This Submessage is invalid when the following is true:
|
'This Submessage is invalid when the following is true:
|
||||||
submessageLength in the Submessage header is too small'
|
submessageLength in the Submessage header is too small'
|
||||||
But if InvalidateFlag is set, Length can be Zero. Since the length is unsigned, there cannot be an invalid length.
|
But if InvalidateFlag is set, Length can be Zero. Since the length is unsigned, there cannot be an invalid length.
|
||||||
|
|
||||||
- 9.4.5.1.2 Flags
|
- 9.4.5.1.2 Flags
|
||||||
Clarify from where the endianness begins.
|
Clarify from where the endianness begins.
|
||||||
One might think it would begin after the Submessage Header, but the length is also endian dependent.
|
One might think it would begin after the Submessage Header, but the length is also endian dependent.
|
||||||
@ -85,6 +83,10 @@
|
|||||||
- 9.4.5.1.3 octetsToNextHeader
|
- 9.4.5.1.3 octetsToNextHeader
|
||||||
Similarly to "9.4.2.11" state that this is always a multiple of four.
|
Similarly to "9.4.2.11" state that this is always a multiple of four.
|
||||||
|
|
||||||
|
* DDS 1.4 ISSUES
|
||||||
|
- 2.2.3 Supported QoS
|
||||||
|
Partition is marked as RxO=No, but should be RxO=Yes? Or not?
|
||||||
|
|
||||||
* Source Port of SPDP is irrelevant, since it is BEST EFFORT and we do not reply (only Destination Port is of significance)
|
* Source Port of SPDP is irrelevant, since it is BEST EFFORT and we do not reply (only Destination Port is of significance)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -494,7 +494,6 @@ begin
|
|||||||
|
|
||||||
AlertIf(GetAffirmCount < check_cnt, "Incomplete test run");
|
AlertIf(GetAffirmCount < check_cnt, "Incomplete test run");
|
||||||
ReportAlerts;
|
ReportAlerts;
|
||||||
wait; --TODO: Remove
|
|
||||||
std.env.stop;
|
std.env.stop;
|
||||||
wait;
|
wait;
|
||||||
end process;
|
end process;
|
||||||
@ -507,10 +506,10 @@ begin
|
|||||||
wait for 25 ns;
|
wait for 25 ns;
|
||||||
end process;
|
end process;
|
||||||
|
|
||||||
fifo_ctl_prc : process
|
in_empty_prc : process
|
||||||
begin
|
begin
|
||||||
in_empty <= '0';
|
in_empty <= '0';
|
||||||
wait; --TODO: Remove
|
wait until rd_sig = '1';
|
||||||
wait until rising_edge(clk);
|
wait until rising_edge(clk);
|
||||||
in_empty <= '1';
|
in_empty <= '1';
|
||||||
wait until rising_edge(clk);
|
wait until rising_edge(clk);
|
||||||
|
|||||||
905
src/Tests/Level_0/rtps_builtin_endpoint_test2.vhd
Normal file
905
src/Tests/Level_0/rtps_builtin_endpoint_test2.vhd
Normal file
@ -0,0 +1,905 @@
|
|||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
library osvvm; -- Utility Library
|
||||||
|
context osvvm.OsvvmContext;
|
||||||
|
|
||||||
|
use work.rtps_package.all;
|
||||||
|
use work.user_config.all;
|
||||||
|
use work.rtps_config_package.all;
|
||||||
|
use work.rtps_test_package.all;
|
||||||
|
|
||||||
|
-- WRITER 0
|
||||||
|
-- * DEFAULT
|
||||||
|
-- WRITER 1
|
||||||
|
-- * TYPE_2
|
||||||
|
-- WRITER 2
|
||||||
|
-- * TOPIC_2
|
||||||
|
-- * TYPE_2
|
||||||
|
-- WRITER 3
|
||||||
|
-- * RELIABILITY BEST_EFFORT
|
||||||
|
-- WRITER 4
|
||||||
|
-- * DURABILITY TRANSIENT_LOCAL
|
||||||
|
-- * PRESENTATION TOPIC
|
||||||
|
-- * COHERENT_ACCESS TRUE
|
||||||
|
-- * DEADLINE 15s
|
||||||
|
-- * LATENCY_BUDGET 1s
|
||||||
|
-- * LIVELINESS MANUAL_BY_PARTICIPANT
|
||||||
|
-- * LEASE_DURATION 15s
|
||||||
|
-- * DESTINATION_ORDER BY_SOURCE_TIMESTAMP
|
||||||
|
-- WRITER 5
|
||||||
|
-- * PRESENTATION TOPIC
|
||||||
|
-- * COHERENT_ACCESS TRUE
|
||||||
|
-- * ORDERED_ACCESS TRUE
|
||||||
|
-- WRITER 6
|
||||||
|
-- * LATENCY_BUDGET 1s
|
||||||
|
-- WRITER 7
|
||||||
|
-- * DURABILITY_SERVICE_CLEANUP_DELAY 86400s
|
||||||
|
-- * DURABILITY_SERVICE_HISTORY KEEP_ALL_HISTORY_QOS
|
||||||
|
-- * DURABILITY_SERVICE_HISTORY_DEPTH 10
|
||||||
|
-- * DURABILITY_SERVICE_MAX_SAMPLES 10
|
||||||
|
-- * DURABILITY_SERVICE_MAX_INSTANCES 5
|
||||||
|
-- * DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE 5
|
||||||
|
-- * OWNERSHIP_STRENGTH 2
|
||||||
|
-- * MAX_BLOCKING_TIME 2s
|
||||||
|
-- * TRANSPORT_PRIORITY 3
|
||||||
|
-- * LIFESPAN 30s
|
||||||
|
-- * USER_DATA "USER_DATA"
|
||||||
|
-- * TOPIC_DATA "TOPIC_DATA"
|
||||||
|
-- * GROUP_DATA "GROUP_DATA"
|
||||||
|
|
||||||
|
-- READER 0
|
||||||
|
-- * DEFAULT
|
||||||
|
-- READER 1
|
||||||
|
-- * TYPE_2
|
||||||
|
-- READER 2
|
||||||
|
-- * TOPIC_2
|
||||||
|
-- * TYPE_2
|
||||||
|
-- READER 3
|
||||||
|
-- * DURABILITY TRANSIENT_LOCAL
|
||||||
|
-- READER 4
|
||||||
|
-- * PRESENTATION TOPIC
|
||||||
|
-- READER 5
|
||||||
|
-- * COHERENT_ACCESS TRUE
|
||||||
|
-- READER 6
|
||||||
|
-- * COHERENT_ACCESS TRUE
|
||||||
|
-- * ORDERED_ACCESS TRUE
|
||||||
|
-- READER 7
|
||||||
|
-- * DEADLINE 10s
|
||||||
|
-- * TIME_BASED_FILTER 5s
|
||||||
|
-- READER 8
|
||||||
|
-- * DEADLINE 20s
|
||||||
|
-- * TIME_BASED_FILTER 5s
|
||||||
|
-- READER 9
|
||||||
|
-- * LATENCY_BUDGET 500ms
|
||||||
|
-- READER 10
|
||||||
|
-- * LATENCY_BUDGET 2s
|
||||||
|
-- READER 11
|
||||||
|
-- * LIVELINESS MANUAL_BY_PARTICIPANT
|
||||||
|
-- * LEASE_DURATION 20s
|
||||||
|
-- READER 12
|
||||||
|
-- * LIVELINESS MANUAL_BY_TOPIC
|
||||||
|
-- * LEASE_DURATION 20s
|
||||||
|
-- READER 13
|
||||||
|
-- * LEASE_DURATION 10s
|
||||||
|
-- READER 14
|
||||||
|
-- * LEASE_DURATION 20s
|
||||||
|
-- READER 15
|
||||||
|
-- * RELIABILITY BEST_EFFORT
|
||||||
|
-- READER 16
|
||||||
|
-- * DESTINATION_ORDER BY_SOURCE_TIMESTAMP
|
||||||
|
|
||||||
|
|
||||||
|
entity rtps_builtin_endpoint_test2 is
|
||||||
|
end entity;
|
||||||
|
|
||||||
|
architecture testbench of rtps_builtin_endpoint_test2 is
|
||||||
|
|
||||||
|
-- *COMPONENT DECLARATION*
|
||||||
|
component rtps_builtin_endpoint is
|
||||||
|
port (
|
||||||
|
clk : in std_logic;
|
||||||
|
reset : in std_logic;
|
||||||
|
empty : in std_logic;
|
||||||
|
rd : out std_logic;
|
||||||
|
data_in : in std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||||
|
data_out : out std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||||
|
last_word_in : in std_logic;
|
||||||
|
time : in TIME_TYPE;
|
||||||
|
endpoint_full : in std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||||
|
endpoint_wr : out std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||||
|
rtps_wr : out std_logic;
|
||||||
|
rtps_full : in std_logic;
|
||||||
|
last_word_out : out std_logic;
|
||||||
|
alive : in std_logic_vector(0 to NUM_ENDPOINTS-1)
|
||||||
|
);
|
||||||
|
end component;
|
||||||
|
|
||||||
|
-- *TYPE DECLARATION*
|
||||||
|
type TEST_STAGE_TYPE is (IDLE, BUSY);
|
||||||
|
type MATCH_MATRIX_TYPE is array (0 to NUM_WRITERS-1) of std_logic_vector(0 to NUM_READERS-1);
|
||||||
|
|
||||||
|
-- *SIGNAL DECLARATION*
|
||||||
|
signal clk, in_empty, rd_sig, last_word_in, last_word_out: std_logic := '0';
|
||||||
|
signal reset : std_logic := '1';
|
||||||
|
signal endpoint_wr, endpoint_full : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
|
||||||
|
signal data_in, data_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
|
||||||
|
signal stim_stage : TEST_STAGE_TYPE := IDLE;
|
||||||
|
shared variable stimulus, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
|
||||||
|
signal packet_sent : std_logic := '0';
|
||||||
|
signal cnt_stim : natural := 0;
|
||||||
|
signal start : std_logic := '0';
|
||||||
|
shared variable SB : work.ScoreBoardPkg_builtin_endpoint.ScoreBoardPType;
|
||||||
|
signal MATCH_MATRIX : MATCH_MATRIX_TYPE := (others => (others => '0'));
|
||||||
|
signal stim_done, check_done : std_logic := '0';
|
||||||
|
|
||||||
|
-- *FUNCTION DECLARATION*
|
||||||
|
procedure wait_on_complete is
|
||||||
|
begin
|
||||||
|
wait until rising_edge(packet_sent);
|
||||||
|
end procedure;
|
||||||
|
|
||||||
|
impure function gen_wr(index : natural; reader : boolean) return std_logic_vector is
|
||||||
|
variable ret : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
|
||||||
|
begin
|
||||||
|
if (reader) then
|
||||||
|
for i in 0 to NUM_WRITERS-1 loop
|
||||||
|
ret(NUM_READERS+i) := MATCH_MATRIX(i)(index);
|
||||||
|
end loop;
|
||||||
|
else
|
||||||
|
for i in 0 to NUM_READERS-1 loop
|
||||||
|
ret(i) := MATCH_MATRIX(index)(i);
|
||||||
|
end loop;
|
||||||
|
end if;
|
||||||
|
return ret;
|
||||||
|
end function;
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
-- Unit Under Test
|
||||||
|
uut : rtps_builtin_endpoint
|
||||||
|
port map (
|
||||||
|
clk => clk,
|
||||||
|
reset => reset,
|
||||||
|
empty => in_empty or packet_sent,
|
||||||
|
rd => rd_sig,
|
||||||
|
data_in => data_in,
|
||||||
|
data_out => data_out,
|
||||||
|
last_word_in => last_word_in,
|
||||||
|
time => TIME_ZERO,
|
||||||
|
endpoint_full => endpoint_full,
|
||||||
|
endpoint_wr => endpoint_wr,
|
||||||
|
rtps_wr => open,
|
||||||
|
rtps_full => '0',
|
||||||
|
last_word_out => last_word_out,
|
||||||
|
alive => (others => '0')
|
||||||
|
);
|
||||||
|
|
||||||
|
stimulus_prc : process
|
||||||
|
variable sub, sub_p, sub_s : RTPS_SUBMESSAGE_TYPE := DEFAULT_RTPS_SUBMESSAGE;
|
||||||
|
variable check_cnt : natural := 0;
|
||||||
|
variable RV : RandomPType;
|
||||||
|
variable p0, p1, p2 : PARTICIPANT_DATA_TYPE := DEFAULT_PARTICIPANT_DATA;
|
||||||
|
variable fixed_readers : ENDPOINT_DATA_ARRAY_TYPE(0 to NUM_READERS-1) := gen_endpoint_array(TRUE);
|
||||||
|
variable fixed_writers : ENDPOINT_DATA_ARRAY_TYPE(0 to NUM_WRITERS-1) := gen_endpoint_array(FALSE);
|
||||||
|
variable endpoint, e1, e2 : ENDPOINT_DATA_TYPE := DEFAULT_ENDPOINT_DATA;
|
||||||
|
variable p0_sn, p0_snp, p0_sns : SEQUENCENUMBER_TYPE := FIRST_SEQUENCENUMBER;
|
||||||
|
variable p1_sn, p1_snp, p1_sns : SEQUENCENUMBER_TYPE := FIRST_SEQUENCENUMBER;
|
||||||
|
variable p2_sn, p2_snp, p2_sns : SEQUENCENUMBER_TYPE := FIRST_SEQUENCENUMBER;
|
||||||
|
variable wr_sig : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
|
||||||
|
variable user_data, topic_data, group_data : STRING_WORD_ARRAY_TYPE := EMPTY_STRING;
|
||||||
|
|
||||||
|
-- Wrapper to use procedure as function
|
||||||
|
impure function gen_rand_loc_2 return LOCATOR_TYPE is
|
||||||
|
variable ret : LOCATOR_TYPE := EMPTY_LOCATOR;
|
||||||
|
begin
|
||||||
|
gen_rand_loc(RV, ret);
|
||||||
|
return ret;
|
||||||
|
end function;
|
||||||
|
|
||||||
|
impure function gen_rand_entityid_2(reader : boolean) return std_logic_vector is
|
||||||
|
variable ret : std_logic_vector(ENTITYID_WIDTH-1 downto 0) := (others => '0');
|
||||||
|
begin
|
||||||
|
gen_rand_entityid(RV, reader, ret);
|
||||||
|
return ret;
|
||||||
|
end function;
|
||||||
|
|
||||||
|
procedure push_reference is
|
||||||
|
begin
|
||||||
|
for i in 0 to reference.length-1 loop
|
||||||
|
SB.Push(wr_sig & reference.last(i) & reference.data(i));
|
||||||
|
end loop;
|
||||||
|
end procedure;
|
||||||
|
|
||||||
|
impure function gen_rand_guid_prefix return GUIDPREFIX_TYPE is
|
||||||
|
variable ret : GUIDPREFIX_TYPE;
|
||||||
|
begin
|
||||||
|
ret := (0 => RV.RandSlv(WORD_WIDTH), 1 => RV.RandSlv(WORD_WIDTH), 2 => RV.RandSlv(WORD_WIDTH));
|
||||||
|
return ret;
|
||||||
|
end function;
|
||||||
|
|
||||||
|
procedure start_test is
|
||||||
|
begin
|
||||||
|
start <= '1';
|
||||||
|
wait until rising_edge(clk);
|
||||||
|
start <= '0';
|
||||||
|
wait until rising_edge(clk);
|
||||||
|
end procedure;
|
||||||
|
begin
|
||||||
|
|
||||||
|
assert (TEST_STRING = "TEST_CONFIG_1") report "user_config incompatible with testbench." severity FAILURE;
|
||||||
|
|
||||||
|
SetAlertLogName("L0-rtps_builtin_endpoint-endpoint_matching");
|
||||||
|
SetAlertEnable(FAILURE, TRUE);
|
||||||
|
SetAlertEnable(ERROR, TRUE);
|
||||||
|
SetAlertEnable(WARNING, TRUE);
|
||||||
|
SetLogEnable(DEBUG, FALSE);
|
||||||
|
SetLogEnable(PASSED, FALSE);
|
||||||
|
SetLogEnable(INFO, TRUE);
|
||||||
|
RV.InitSeed(RV'instance_name);
|
||||||
|
|
||||||
|
-- Populate MATCH Matrix
|
||||||
|
MATCH_MATRIX <= (
|
||||||
|
0 => (0 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0'),
|
||||||
|
1 => (1 => '1', others => '0'),
|
||||||
|
2 => (2 => '1', others => '0'),
|
||||||
|
3 => (15 => '1', others => '0'),
|
||||||
|
4 => (0 => '1', 3 => '1', 4 => '1', 5 => '1', 8 => '1', 9 => '1', 10 => '1', 11 => '1', 14 => '1', 15 => '1', 16 => '1', others => '0'),
|
||||||
|
5 => (0 => '1', 4 => '1', 5 => '1', 6 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0'),
|
||||||
|
6 => (10 => '1', others => '0'),
|
||||||
|
7 => (0 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0')
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Participant RTPS Submessage
|
||||||
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
||||||
|
sub.submessageID := SID_DATA;
|
||||||
|
sub.writerId := ENTITYID_SPDP_BUILTIN_PARTICIPANT_ANNOUNCER;
|
||||||
|
sub.readerId := ENTITYID_SPDP_BUILTIN_PARTICIPANT_DETECTOR;
|
||||||
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
||||||
|
|
||||||
|
-- Publisher Endpoint RTPS Submessage
|
||||||
|
sub_p := DEFAULT_RTPS_SUBMESSAGE;
|
||||||
|
sub_p.submessageID := SID_DATA;
|
||||||
|
sub_p.writerId := ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER;
|
||||||
|
sub_p.readerId := ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR;
|
||||||
|
sub_p.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
||||||
|
|
||||||
|
-- Subscriber Endpoint RTPS Submessage
|
||||||
|
sub_s := DEFAULT_RTPS_SUBMESSAGE;
|
||||||
|
sub_s.submessageID := SID_DATA;
|
||||||
|
sub_s.writerId := ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER;
|
||||||
|
sub_s.readerId := ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR;
|
||||||
|
sub_s.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
||||||
|
|
||||||
|
-- Participant 0 (Contains the fixed Endpoints)
|
||||||
|
p0.guidPrefix := gen_rand_guid_prefix;
|
||||||
|
p0.nr := 0;
|
||||||
|
p0.defaultUnicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR));
|
||||||
|
p0.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_DETECTOR) := '1';
|
||||||
|
p0.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_ANNOUNCER):= '1';
|
||||||
|
p0.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_DETECTOR) := '1';
|
||||||
|
p0.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_ANNOUNCER) := '1';
|
||||||
|
|
||||||
|
-- Participant 1 (Contains the fixed Endpoints in Little Endian)
|
||||||
|
p1.guidPrefix := gen_rand_guid_prefix;
|
||||||
|
p1.nr := 1;
|
||||||
|
p1.littleEndian := '1';
|
||||||
|
p1.defaultUnicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR));
|
||||||
|
p1.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_DETECTOR) := '1';
|
||||||
|
p1.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_ANNOUNCER):= '1';
|
||||||
|
p1.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_DETECTOR) := '1';
|
||||||
|
p1.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_ANNOUNCER) := '1';
|
||||||
|
|
||||||
|
-- Participant 2 (Used for dyncamic Endpoints)
|
||||||
|
p2.guidPrefix := gen_rand_guid_prefix;
|
||||||
|
p2.nr := 2;
|
||||||
|
p2.defaultUnicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR));
|
||||||
|
p2.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_DETECTOR) := '1';
|
||||||
|
p2.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_ANNOUNCER):= '1';
|
||||||
|
p2.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_DETECTOR) := '1';
|
||||||
|
p2.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_ANNOUNCER) := '1';
|
||||||
|
|
||||||
|
for i in 0 to fixed_writers'length-1 loop
|
||||||
|
fixed_writers(i).entityId := gen_rand_entityid_2(FALSE);
|
||||||
|
end loop;
|
||||||
|
for i in 0 to fixed_readers'length-1 loop
|
||||||
|
fixed_readers(i).entityId := gen_rand_entityid_2(TRUE);
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
e1.participant := p2;
|
||||||
|
e1.entityId := gen_rand_entityid_2(FALSE);
|
||||||
|
e1.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
e1.type_name := ENDPOINT_TYPE(0);
|
||||||
|
e2.participant := p2;
|
||||||
|
e2.entityId := gen_rand_entityid_2(TRUE);
|
||||||
|
e2.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
e2.type_name := ENDPOINT_TYPE(0);
|
||||||
|
|
||||||
|
user_data := convert_string("USER_DATA" & (10 to 256 => NUL));
|
||||||
|
group_data := convert_string("GROUP_DATA" & (11 to 256 => NUL));
|
||||||
|
topic_data := convert_string("TOPIC_DATA" & (11 to 256 => NUL));
|
||||||
|
|
||||||
|
Log("Initiating Test", INFO);
|
||||||
|
stim_done <= '0';
|
||||||
|
start <= '0';
|
||||||
|
reset <= '1';
|
||||||
|
wait until rising_edge(clk);
|
||||||
|
wait until rising_edge(clk);
|
||||||
|
reset <= '0';
|
||||||
|
|
||||||
|
-- *Insert Participant 0*
|
||||||
|
-- Contains the same Endpoints as our Participant, as defined above
|
||||||
|
Log("Match Participant 0 [Compatible]", INFO);
|
||||||
|
sub.writerSN := p0_sn;
|
||||||
|
gen_participant_data(p0, sub.data);
|
||||||
|
gen_sentinel(sub.data);
|
||||||
|
gen_rtps_handler_out(sub, gen_rand_loc_2, TRUE, TIME_INVALID, p0.guidPrefix, stimulus);
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub.data := EMPTY_TEST_PACKET;
|
||||||
|
p0_sn := p0_sn + 1;
|
||||||
|
|
||||||
|
-- *Insert Participant 1*
|
||||||
|
-- Contains the same Endpoints as Participant 0, but in little Endian
|
||||||
|
Log("Match Participant 1 [Compatible, Little Endian]", INFO);
|
||||||
|
sub.writerSN := p1_sn;
|
||||||
|
gen_participant_data(p1, sub.data);
|
||||||
|
gen_sentinel(sub.data);
|
||||||
|
gen_rtps_handler_out(sub, gen_rand_loc_2, TRUE, TIME_INVALID, p1.guidPrefix, stimulus);
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub.data := EMPTY_TEST_PACKET;
|
||||||
|
p1_sn := p1_sn + 1;
|
||||||
|
|
||||||
|
-- *Insert Participant 2*
|
||||||
|
-- Used for extra Endpoint testing (e.g. unsupported QoS)
|
||||||
|
Log("Match Participant 2 [Compatible]", INFO);
|
||||||
|
sub.writerSN := p2_sn;
|
||||||
|
gen_participant_data(p2, sub.data);
|
||||||
|
gen_sentinel(sub.data);
|
||||||
|
gen_rtps_handler_out(sub, gen_rand_loc_2, TRUE, TIME_INVALID, p2.guidPrefix, stimulus);
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_sn := p2_sn + 1;
|
||||||
|
|
||||||
|
-- *Fixed Writers (Participant 0)*
|
||||||
|
for i in 0 to NUM_WRITERS-1 loop
|
||||||
|
Log("Fixed Writer " & to_string(i) & ", Participant 0", INFO);
|
||||||
|
sub_p.writerSN := p0_snp;
|
||||||
|
endpoint := fixed_writers(i);
|
||||||
|
endpoint.participant := p0;
|
||||||
|
gen_endpoint_data(endpoint, sub_p.data);
|
||||||
|
gen_sentinel(sub_p.data);
|
||||||
|
gen_rtps_handler_out(sub_p, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(endpoint, reference);
|
||||||
|
wr_sig := gen_wr(i, FALSE);
|
||||||
|
if (or wr_sig = '1') then
|
||||||
|
push_reference;
|
||||||
|
end if;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_p.data := EMPTY_TEST_PACKET;
|
||||||
|
p0_snp := p0_snp + 1;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
-- *Fixed Writers (Participant 1)[Little Endian]*
|
||||||
|
for i in 0 to NUM_WRITERS-1 loop
|
||||||
|
Log("Fixed Writer " & to_string(i) & ", Participant 1 [Little Endian]", INFO);
|
||||||
|
sub_p.writerSN := p1_snp;
|
||||||
|
endpoint := fixed_writers(i);
|
||||||
|
endpoint.participant := p1;
|
||||||
|
endpoint.littleEndian:= '1';
|
||||||
|
gen_endpoint_data(endpoint, sub_p.data);
|
||||||
|
gen_sentinel(sub_p.data);
|
||||||
|
gen_rtps_handler_out(sub_p, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(endpoint, reference);
|
||||||
|
wr_sig := gen_wr(i, FALSE);
|
||||||
|
if (or wr_sig = '1') then
|
||||||
|
push_reference;
|
||||||
|
end if;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_p.data := EMPTY_TEST_PACKET;
|
||||||
|
p1_snp := p1_snp + 1;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
-- *Fixed Readers (Participant 0)*
|
||||||
|
for i in 0 to NUM_READERS-1 loop
|
||||||
|
Log("Fixed Reader " & to_string(i) & ", Participant 0", INFO);
|
||||||
|
sub_s.writerSN := p0_sns;
|
||||||
|
endpoint := fixed_readers(i);
|
||||||
|
endpoint.participant := p0;
|
||||||
|
gen_endpoint_data(endpoint, sub_s.data);
|
||||||
|
gen_sentinel(sub_s.data);
|
||||||
|
gen_rtps_handler_out(sub_s, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(endpoint, reference);
|
||||||
|
wr_sig := gen_wr(i, TRUE);
|
||||||
|
if (or wr_sig = '1') then
|
||||||
|
push_reference;
|
||||||
|
end if;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_s.data := EMPTY_TEST_PACKET;
|
||||||
|
p0_sns := p0_sns + 1;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
-- *Fixed Readers (Participant 1)[Little Endian]*
|
||||||
|
for i in 0 to NUM_READERS-1 loop
|
||||||
|
Log("Fixed Reader " & to_string(i) & ", Participant 1", INFO);
|
||||||
|
sub_s.writerSN := p1_sns;
|
||||||
|
endpoint := fixed_readers(i);
|
||||||
|
endpoint.participant := p1;
|
||||||
|
endpoint.littleEndian:= '1';
|
||||||
|
gen_endpoint_data(endpoint, sub_s.data);
|
||||||
|
gen_sentinel(sub_s.data);
|
||||||
|
gen_rtps_handler_out(sub_s, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(endpoint, reference);
|
||||||
|
wr_sig := gen_wr(i, TRUE);
|
||||||
|
if (or wr_sig = '1') then
|
||||||
|
push_reference;
|
||||||
|
end if;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_s.data := EMPTY_TEST_PACKET;
|
||||||
|
p1_sns := p1_sns + 1;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
-- *Remove Participant 1*
|
||||||
|
Log("Unmatch Participant 1", INFO);
|
||||||
|
sub.writerSN := p1_sn;
|
||||||
|
p1.domainId := int(2, DOMAIN_ID_WIDTH);
|
||||||
|
p1.match := UNMATCH;
|
||||||
|
gen_participant_data(p1, sub.data);
|
||||||
|
gen_sentinel(sub.data);
|
||||||
|
gen_rtps_handler_out(sub, gen_rand_loc_2, TRUE, TIME_INVALID, p1.guidPrefix, stimulus);
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub.data := EMPTY_TEST_PACKET;
|
||||||
|
p1_sn := p1_sn + 1;
|
||||||
|
-- Unmatch Participant 1 Endpoints
|
||||||
|
for i in 0 to NUM_WRITERS-1 loop
|
||||||
|
endpoint := fixed_writers(i);
|
||||||
|
endpoint.participant := p1;
|
||||||
|
endpoint.littleEndian := '1';
|
||||||
|
endpoint.match := UNMATCH;
|
||||||
|
gen_match_frame(endpoint, reference);
|
||||||
|
wr_sig := gen_wr(i, FALSE);
|
||||||
|
if (or wr_sig = '1') then
|
||||||
|
push_reference;
|
||||||
|
end if;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
end loop;
|
||||||
|
for i in 0 to NUM_READERS-1 loop
|
||||||
|
endpoint := fixed_readers(i);
|
||||||
|
endpoint.participant := p1;
|
||||||
|
endpoint.littleEndian := '1';
|
||||||
|
endpoint.match := UNMATCH;
|
||||||
|
gen_match_frame(endpoint, reference);
|
||||||
|
wr_sig := gen_wr(i, TRUE);
|
||||||
|
if (or wr_sig = '1') then
|
||||||
|
push_reference;
|
||||||
|
end if;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
|
||||||
|
-- *Participant 2 Endpoints*
|
||||||
|
|
||||||
|
-- Writers
|
||||||
|
|
||||||
|
Log("Match Participant 2 Writer [Durability Persistent]", INFO);
|
||||||
|
sub_p.writerSN := p2_snp;
|
||||||
|
endpoint := DEFAULT_ENDPOINT_DATA;
|
||||||
|
endpoint.entityId := gen_rand_entityid_2(FALSE);
|
||||||
|
endpoint.participant := p2;
|
||||||
|
endpoint.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
endpoint.type_name := ENDPOINT_TYPE(0);
|
||||||
|
endpoint.durability := PERSISTENT_DURABILITY_QOS;
|
||||||
|
gen_endpoint_data(endpoint, sub_p.data);
|
||||||
|
gen_sentinel(sub_p.data);
|
||||||
|
gen_rtps_handler_out(sub_p, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(endpoint, reference);
|
||||||
|
wr_sig := (0 => '1', 3 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_p.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_snp := p2_snp + 1;
|
||||||
|
|
||||||
|
Log("Match Participant 2 Writer [Presentation Group]", INFO);
|
||||||
|
sub_p.writerSN := p2_snp;
|
||||||
|
endpoint := DEFAULT_ENDPOINT_DATA;
|
||||||
|
endpoint.entityId := gen_rand_entityid_2(FALSE);
|
||||||
|
endpoint.participant := p2;
|
||||||
|
endpoint.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
endpoint.type_name := ENDPOINT_TYPE(0);
|
||||||
|
endpoint.presentation := GROUP_PRESENTATION_QOS;
|
||||||
|
gen_endpoint_data(endpoint, sub_p.data);
|
||||||
|
gen_sentinel(sub_p.data);
|
||||||
|
gen_rtps_handler_out(sub_p, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(endpoint, reference);
|
||||||
|
wr_sig := (0 => '1', 4 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_p.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_snp := p2_snp + 1;
|
||||||
|
|
||||||
|
Log("Ignore Participant 2 Writer [Ownership Exclusive]", INFO);
|
||||||
|
sub_p.writerSN := p2_snp;
|
||||||
|
endpoint := DEFAULT_ENDPOINT_DATA;
|
||||||
|
endpoint.entityId := gen_rand_entityid_2(FALSE);
|
||||||
|
endpoint.participant := p2;
|
||||||
|
endpoint.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
endpoint.type_name := ENDPOINT_TYPE(0);
|
||||||
|
endpoint.ownership := EXCLUSIVE_OWNERSHIP_QOS;
|
||||||
|
gen_endpoint_data(endpoint, sub_p.data);
|
||||||
|
gen_sentinel(sub_p.data);
|
||||||
|
gen_rtps_handler_out(sub_p, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_p.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_snp := p2_snp + 1;
|
||||||
|
|
||||||
|
Log("Match Participant 2 Writer [USER_DATA, TOPIC_DATA, GROUP_DATA, MAX_SERIALIZED_PAYLOAD]", INFO);
|
||||||
|
sub_p.writerSN := p2_snp;
|
||||||
|
endpoint := DEFAULT_ENDPOINT_DATA;
|
||||||
|
endpoint.entityId := gen_rand_entityid_2(FALSE);
|
||||||
|
endpoint.participant := p2;
|
||||||
|
endpoint.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
endpoint.type_name := ENDPOINT_TYPE(0);
|
||||||
|
endpoint.user_data := user_data;
|
||||||
|
endpoint.topic_data := topic_data;
|
||||||
|
endpoint.group_data := group_data;
|
||||||
|
endpoint.max_size_serialized:= std_logic_vector(to_unsigned(65000, CDR_LONG_WIDTH));
|
||||||
|
gen_endpoint_data(endpoint, sub_p.data);
|
||||||
|
gen_sentinel(sub_p.data);
|
||||||
|
gen_rtps_handler_out(sub_p, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(endpoint, reference);
|
||||||
|
wr_sig := (0 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_p.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_snp := p2_snp + 1;
|
||||||
|
|
||||||
|
Log("ignore Participant 2 Writer [incompatible MAX_SERIALIZED_PAYLOAD]", INFO);
|
||||||
|
sub_p.writerSN := p2_snp;
|
||||||
|
endpoint := DEFAULT_ENDPOINT_DATA;
|
||||||
|
endpoint.entityId := gen_rand_entityid_2(FALSE);
|
||||||
|
endpoint.participant := p2;
|
||||||
|
endpoint.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
endpoint.type_name := ENDPOINT_TYPE(0);
|
||||||
|
endpoint.user_data := user_data;
|
||||||
|
endpoint.topic_data := topic_data;
|
||||||
|
endpoint.group_data := group_data;
|
||||||
|
endpoint.max_size_serialized:= std_logic_vector(to_unsigned(66000, CDR_LONG_WIDTH));
|
||||||
|
gen_endpoint_data(endpoint, sub_p.data);
|
||||||
|
gen_sentinel(sub_p.data);
|
||||||
|
gen_rtps_handler_out(sub_p, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_p.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_snp := p2_snp + 1;
|
||||||
|
|
||||||
|
-- Readers
|
||||||
|
|
||||||
|
Log("Ignore Participant 2 Reader [Durability Persistent]", INFO);
|
||||||
|
sub_s.writerSN := p2_sns;
|
||||||
|
endpoint := DEFAULT_ENDPOINT_DATA;
|
||||||
|
endpoint.entityId := gen_rand_entityid_2(TRUE);
|
||||||
|
endpoint.participant := p2;
|
||||||
|
endpoint.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
endpoint.type_name := ENDPOINT_TYPE(0);
|
||||||
|
endpoint.durability := PERSISTENT_DURABILITY_QOS;
|
||||||
|
gen_endpoint_data(endpoint, sub_s.data);
|
||||||
|
gen_sentinel(sub_s.data);
|
||||||
|
gen_rtps_handler_out(sub_s, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_s.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_sns := p2_sns + 1;
|
||||||
|
|
||||||
|
Log("Ignore Participant 2 Reader [Presentation Group]", INFO);
|
||||||
|
sub_s.writerSN := p2_sns;
|
||||||
|
endpoint := DEFAULT_ENDPOINT_DATA;
|
||||||
|
endpoint.entityId := gen_rand_entityid_2(TRUE);
|
||||||
|
endpoint.participant := p2;
|
||||||
|
endpoint.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
endpoint.type_name := ENDPOINT_TYPE(0);
|
||||||
|
endpoint.presentation := GROUP_PRESENTATION_QOS;
|
||||||
|
gen_endpoint_data(endpoint, sub_s.data);
|
||||||
|
gen_sentinel(sub_s.data);
|
||||||
|
gen_rtps_handler_out(sub_s, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_s.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_sns := p2_sns + 1;
|
||||||
|
|
||||||
|
|
||||||
|
Log("Ignore Participant 2 Reader [Ownership Exclusive]", INFO);
|
||||||
|
sub_s.writerSN := p2_sns;
|
||||||
|
endpoint := DEFAULT_ENDPOINT_DATA;
|
||||||
|
endpoint.entityId := gen_rand_entityid_2(TRUE);
|
||||||
|
endpoint.participant := p2;
|
||||||
|
endpoint.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
endpoint.type_name := ENDPOINT_TYPE(0);
|
||||||
|
endpoint.ownership := EXCLUSIVE_OWNERSHIP_QOS;
|
||||||
|
gen_endpoint_data(endpoint, sub_s.data);
|
||||||
|
gen_sentinel(sub_s.data);
|
||||||
|
gen_rtps_handler_out(sub_s, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_s.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_sns := p2_sns + 1;
|
||||||
|
|
||||||
|
Log("Match Participant 2 Reader [USER_DATA, TOPIC_DATA, GROUP_DATA, EXPECTS_INLINE_QOS]", INFO);
|
||||||
|
sub_s.writerSN := p2_sns;
|
||||||
|
endpoint := DEFAULT_ENDPOINT_DATA;
|
||||||
|
endpoint.entityId := gen_rand_entityid_2(TRUE);
|
||||||
|
endpoint.participant := p2;
|
||||||
|
endpoint.topic_name := ENDPOINT_TOPIC(0);
|
||||||
|
endpoint.type_name := ENDPOINT_TYPE(0);
|
||||||
|
endpoint.user_data := user_data;
|
||||||
|
endpoint.topic_data := topic_data;
|
||||||
|
endpoint.group_data := group_data;
|
||||||
|
endpoint.expectsInlineQoS(0):= '1';
|
||||||
|
gen_endpoint_data(endpoint, sub_s.data);
|
||||||
|
gen_sentinel(sub_s.data);
|
||||||
|
gen_rtps_handler_out(sub_s, gen_rand_loc_2, TRUE, TIME_INVALID, endpoint.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(endpoint, reference);
|
||||||
|
wr_sig := (NUM_READERS => '1', NUM_READERS+4 => '1', NUM_READERS+5 => '1', NUM_READERS+7 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_s.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_sns := p2_sns + 1;
|
||||||
|
|
||||||
|
-- Reader/Writer Match/Unmatch
|
||||||
|
|
||||||
|
Log("Match Participant 2 Writer [Default]", INFO);
|
||||||
|
sub_p.writerSN := p2_snp;
|
||||||
|
gen_endpoint_data(e1, sub_p.data);
|
||||||
|
gen_sentinel(sub_p.data);
|
||||||
|
gen_rtps_handler_out(sub_p, gen_rand_loc_2, TRUE, TIME_INVALID, e1.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(e1, reference);
|
||||||
|
wr_sig := (0 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_p.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_snp := p2_snp + 1;
|
||||||
|
|
||||||
|
Log("Match Participant 2 Reader [Default]", INFO);
|
||||||
|
sub_s.writerSN := p2_sns;
|
||||||
|
gen_endpoint_data(e2, sub_s.data);
|
||||||
|
gen_sentinel(sub_s.data);
|
||||||
|
gen_rtps_handler_out(sub_s, gen_rand_loc_2, TRUE, TIME_INVALID, e2.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(e2, reference);
|
||||||
|
wr_sig := (NUM_READERS => '1', NUM_READERS+4 => '1', NUM_READERS+5 => '1', NUM_READERS+7 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_s.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_sns := p2_sns + 1;
|
||||||
|
|
||||||
|
Log("Update Participant 2 Writer [Unicast Locators (1 valid, 2 invalid)]", INFO);
|
||||||
|
sub_p.writerSN := p2_snp;
|
||||||
|
e1.unicastLocatorList := (numLocators => int(4,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, 1 => gen_rand_loc_2, 2 => gen_rand_loc_2, 3 => gen_rand_loc_2, others => EMPTY_LOCATOR));
|
||||||
|
e1.unicastLocatorList.locator(1).kind := LOCATOR_KIND_UDPv6;
|
||||||
|
e1.unicastLocatorList.locator(2).addr := (others => '0');
|
||||||
|
e1.unicastLocatorList.locator(3).portn := (others => '0');
|
||||||
|
gen_endpoint_data(e1, sub_p.data);
|
||||||
|
gen_sentinel(sub_p.data);
|
||||||
|
gen_rtps_handler_out(sub_p, gen_rand_loc_2, TRUE, TIME_INVALID, e1.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(e1, reference);
|
||||||
|
wr_sig := (0 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_p.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_snp := p2_snp + 1;
|
||||||
|
|
||||||
|
Log("Update Participant 2 Reader [Multicast Locator (1 valid, 2 invalid)]", INFO);
|
||||||
|
sub_s.writerSN := p2_sns;
|
||||||
|
e2.multicastLocatorList := (numLocators => int(4,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, 1 => gen_rand_loc_2, 2 => gen_rand_loc_2, 3 => gen_rand_loc_2, others => EMPTY_LOCATOR));
|
||||||
|
e2.multicastLocatorList.locator(1).kind := LOCATOR_KIND_UDPv6;
|
||||||
|
e2.multicastLocatorList.locator(2).addr := (others => '0');
|
||||||
|
e2.multicastLocatorList.locator(3).portn := (others => '0');
|
||||||
|
gen_endpoint_data(e2, sub_s.data);
|
||||||
|
gen_sentinel(sub_s.data);
|
||||||
|
gen_rtps_handler_out(sub_s, gen_rand_loc_2, TRUE, TIME_INVALID, e2.participant.guidPrefix, stimulus);
|
||||||
|
gen_match_frame(e2, reference);
|
||||||
|
wr_sig := (NUM_READERS => '1', NUM_READERS+4 => '1', NUM_READERS+5 => '1', NUM_READERS+7 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_s.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_sns := p2_sns + 1;
|
||||||
|
|
||||||
|
Log("Change Match Participant 2 Writer [Reliability Best Effort]", INFO);
|
||||||
|
sub_p.writerSN := p2_snp;
|
||||||
|
e1.reliability := BEST_EFFORT_RELIABILITY_QOS;
|
||||||
|
gen_endpoint_data(e1, sub_p.data);
|
||||||
|
gen_sentinel(sub_p.data);
|
||||||
|
gen_rtps_handler_out(sub_p, gen_rand_loc_2, TRUE, TIME_INVALID, e1.participant.guidPrefix, stimulus);
|
||||||
|
-- MATCH
|
||||||
|
gen_match_frame(e1, reference);
|
||||||
|
wr_sig := (15 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
-- UNMATCH
|
||||||
|
e1.match := UNMATCH;
|
||||||
|
gen_match_frame(e1, reference);
|
||||||
|
wr_sig := (0 => '1', 9 => '1', 10 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_p.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_snp := p2_snp + 1;
|
||||||
|
|
||||||
|
Log("Change Match Participant 2 Reader [Topic & Type Change]", INFO);
|
||||||
|
sub_s.writerSN := p2_sns;
|
||||||
|
e2.topic_name := ENDPOINT_TOPIC(2);
|
||||||
|
e2.type_name := ENDPOINT_TYPE(2);
|
||||||
|
gen_endpoint_data(e2, sub_s.data);
|
||||||
|
gen_sentinel(sub_s.data);
|
||||||
|
gen_rtps_handler_out(sub_s, gen_rand_loc_2, TRUE, TIME_INVALID, e2.participant.guidPrefix, stimulus);
|
||||||
|
-- MATCH
|
||||||
|
gen_match_frame(e2, reference);
|
||||||
|
wr_sig := (NUM_READERS+2 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
-- UNMATCH
|
||||||
|
e2.match := UNMATCH;
|
||||||
|
gen_match_frame(e2, reference);
|
||||||
|
wr_sig := (NUM_READERS => '1', NUM_READERS+4 => '1', NUM_READERS+5 => '1', NUM_READERS+7 => '1', others => '0');
|
||||||
|
push_reference;
|
||||||
|
start_test;
|
||||||
|
wait_on_complete;
|
||||||
|
stimulus := EMPTY_TEST_PACKET;
|
||||||
|
reference := EMPTY_TEST_PACKET;
|
||||||
|
sub_s.data := EMPTY_TEST_PACKET;
|
||||||
|
p2_sns := p2_sns + 1;
|
||||||
|
|
||||||
|
stim_done <= '1';
|
||||||
|
wait until check_done = '1';
|
||||||
|
ReportAlerts;
|
||||||
|
std.env.stop;
|
||||||
|
wait;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
clock_prc : process
|
||||||
|
begin
|
||||||
|
clk <= '0';
|
||||||
|
wait for 25 ns;
|
||||||
|
clk <= '1';
|
||||||
|
wait for 25 ns;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
in_empty_prc : process
|
||||||
|
begin
|
||||||
|
in_empty <= '0';
|
||||||
|
wait until rd_sig = '1';
|
||||||
|
wait until rising_edge(clk);
|
||||||
|
in_empty <= '1';
|
||||||
|
wait until rising_edge(clk);
|
||||||
|
end process;
|
||||||
|
|
||||||
|
endpoint_full_prc : process
|
||||||
|
begin
|
||||||
|
endpoint_full <= (others => '0');
|
||||||
|
wait until (or endpoint_wr) = '1';
|
||||||
|
wait until rising_edge(clk);
|
||||||
|
endpoint_full <= (others => '1');
|
||||||
|
wait until rising_edge(clk);
|
||||||
|
end process;
|
||||||
|
|
||||||
|
alert_prc : process(all)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
alertif(in_empty = '1' and rd_sig = '1', "Input FIFO read signal high while empty signal high", ERROR);
|
||||||
|
alertif(endpoint_full /= (0 to NUM_ENDPOINTS-1 => '0') and (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
input_prc : process(all)
|
||||||
|
begin
|
||||||
|
data_in <= stimulus.data(cnt_stim);
|
||||||
|
last_word_in <= stimulus.last(cnt_stim);
|
||||||
|
case (stim_stage) is
|
||||||
|
when IDLE =>
|
||||||
|
packet_sent <= '1';
|
||||||
|
when BUSY =>
|
||||||
|
packet_sent <= '0';
|
||||||
|
end case;
|
||||||
|
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if (reset = '1') then
|
||||||
|
cnt_stim <= 0;
|
||||||
|
stim_stage <= IDLE;
|
||||||
|
else
|
||||||
|
case (stim_stage) is
|
||||||
|
when IDLE =>
|
||||||
|
if (start = '1') then
|
||||||
|
stim_stage <= BUSY;
|
||||||
|
cnt_stim <= 0;
|
||||||
|
end if;
|
||||||
|
when BUSY =>
|
||||||
|
if (cnt_stim = stimulus.length) then
|
||||||
|
stim_stage <= IDLE;
|
||||||
|
elsif (rd_sig = '1') then
|
||||||
|
cnt_stim <= cnt_stim + 1;
|
||||||
|
end if;
|
||||||
|
end case;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
output_prc : process(all)
|
||||||
|
begin
|
||||||
|
check_done <= '0';
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')) then
|
||||||
|
SB.Check(endpoint_wr & last_word_out & data_out);
|
||||||
|
end if;
|
||||||
|
if (stim_done = '1' and SB.empty) then
|
||||||
|
check_done <= '1';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
watchdog : process
|
||||||
|
begin
|
||||||
|
wait for 1 ms;
|
||||||
|
Alert("Test timeout", FAILURE);
|
||||||
|
std.env.stop;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
end architecture;
|
||||||
17
src/Tests/ScoreBoard_builtin_endpoint.vhd
Normal file
17
src/Tests/ScoreBoard_builtin_endpoint.vhd
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
library osvvm; -- Utility Library
|
||||||
|
context osvvm.OsvvmContext;
|
||||||
|
|
||||||
|
use work.rtps_test_package.all;
|
||||||
|
|
||||||
|
package ScoreBoardPkg_builtin_endpoint is new osvvm.ScoreboardGenericPkg
|
||||||
|
generic map (
|
||||||
|
ExpectedType => std_logic_vector,
|
||||||
|
ActualType => std_logic_vector,
|
||||||
|
Match => std_match,
|
||||||
|
expected_to_string => to_string1,
|
||||||
|
actual_to_string => to_string1
|
||||||
|
);
|
||||||
@ -13,9 +13,9 @@ package user_config is
|
|||||||
-- Unicast IPv4 Address used by all RTPS Entities [Default 192.168.0.80]
|
-- Unicast IPv4 Address used by all RTPS Entities [Default 192.168.0.80]
|
||||||
constant DEFAULT_IPv4_ADDRESS : std_logic_vector(IPv4_ADDRESS_WIDTH-1 downto 0) := x"C0A80080";
|
constant DEFAULT_IPv4_ADDRESS : std_logic_vector(IPv4_ADDRESS_WIDTH-1 downto 0) := x"C0A80080";
|
||||||
-- Number of RTPS Writer Endpoints
|
-- Number of RTPS Writer Endpoints
|
||||||
constant NUM_WRITERS : natural := 2;
|
constant NUM_WRITERS : natural := 8;
|
||||||
-- Number of RTPS Reader Endpoints
|
-- Number of RTPS Reader Endpoints
|
||||||
constant NUM_READERS : natural := 2;
|
constant NUM_READERS : natural := 17;
|
||||||
-- Number of RTPS Endpoints (Do not modify)
|
-- Number of RTPS Endpoints (Do not modify)
|
||||||
constant NUM_ENDPOINTS : natural := NUM_READERS+NUM_WRITERS;
|
constant NUM_ENDPOINTS : natural := NUM_READERS+NUM_WRITERS;
|
||||||
-- PB Value of Default Port Generation (see DDSI-RTPS 2.3 Section 9.6.1)
|
-- PB Value of Default Port Generation (see DDSI-RTPS 2.3 Section 9.6.1)
|
||||||
@ -43,9 +43,19 @@ package user_config is
|
|||||||
-- Array denoting if Endpoints use Keyed Topics
|
-- Array denoting if Endpoints use Keyed Topics
|
||||||
constant ENDPOINT_WITH_KEY : USER_BOOLEAN_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => FALSE);
|
constant ENDPOINT_WITH_KEY : USER_BOOLEAN_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => FALSE);
|
||||||
-- Array mapping Topic Names to Endpoints
|
-- Array mapping Topic Names to Endpoints
|
||||||
constant ENDPOINT_TOPIC_STRING : USER_STRING_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => "Placeholder" & (12 to 256 => NUL));
|
constant ENDPOINT_TOPIC_STRING : USER_STRING_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
2 => "TOPIC_2" & (8 to 256 => NUL),
|
||||||
|
NUM_READERS+2 => "TOPIC_2" & (8 to 256 => NUL),
|
||||||
|
others => "TOPIC_1" & (8 to 256 => NUL)
|
||||||
|
);
|
||||||
-- Array mapping Type Names to Endpoints
|
-- Array mapping Type Names to Endpoints
|
||||||
constant ENDPOINT_TYPE_STRING : USER_STRING_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => "Placeholder" & (12 to 256 => NUL));
|
constant ENDPOINT_TYPE_STRING : USER_STRING_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
1 => "TYPE_2" & (7 to 256 => NUL),
|
||||||
|
2 => "TYPE_2" & (7 to 256 => NUL),
|
||||||
|
NUM_READERS+1 => "TYPE_2" & (7 to 256 => NUL),
|
||||||
|
NUM_READERS+2 => "TYPE_2" & (7 to 256 => NUL),
|
||||||
|
others => "TYPE_1" & (7 to 256 => NUL)
|
||||||
|
);
|
||||||
-- *TIMING CHARACTERISTICS*
|
-- *TIMING CHARACTERISTICS*
|
||||||
-- Timing Characteristics for Participant
|
-- Timing Characteristics for Participant
|
||||||
constant PARTICIPANT_ANNOUNCEMENT_PERIOD : DURATION_TYPE := gen_duration(30,0); -- 30 s
|
constant PARTICIPANT_ANNOUNCEMENT_PERIOD : DURATION_TYPE := gen_duration(30,0); -- 30 s
|
||||||
@ -68,41 +78,126 @@ package user_config is
|
|||||||
|
|
||||||
--***ENDPOINT DDS QOS***
|
--***ENDPOINT DDS QOS***
|
||||||
-- Array mapping DURABILITY QoS to Endpoints
|
-- Array mapping DURABILITY QoS to Endpoints
|
||||||
constant ENDPOINT_DURABILITY_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_DURABILITY_QOS);
|
constant ENDPOINT_DURABILITY_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
constant ENDPOINT_DURABILITY_SERVICE_CLEANUP_DELAY : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_DURABILITY_SERVICE_CLEANUP_DELAY);
|
3 => TRANSIENT_LOCAL_DURABILITY_QOS,
|
||||||
constant ENDPOINT_DURABILITY_SERVICE_HISTORY : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_DURABILITY_SERVICE_HISTORY);
|
NUM_READERS+4 => TRANSIENT_LOCAL_DURABILITY_QOS,
|
||||||
constant ENDPOINT_DURABILITY_SERVICE_HISTORY_DEPTH : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_DURABILITY_SERVICE_HISTORY_DEPTH);
|
others => DEFAULT_DURABILITY_QOS
|
||||||
constant ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_DURABILITY_SERVICE_MAX_SAMPLES);
|
);
|
||||||
constant ENDPOINT_DURABILITY_SERVICE_MAX_INSTANCES : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_DURABILITY_SERVICE_MAX_INSTANCES);
|
constant ENDPOINT_DURABILITY_SERVICE_CLEANUP_DELAY : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
constant ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE);
|
NUM_READERS+7 => gen_duration(86400,0),
|
||||||
|
others => DEFAULT_DURABILITY_SERVICE_CLEANUP_DELAY
|
||||||
|
);
|
||||||
|
constant ENDPOINT_DURABILITY_SERVICE_HISTORY : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
NUM_READERS+7 => KEEP_ALL_HISTORY_QOS,
|
||||||
|
others => DEFAULT_DURABILITY_SERVICE_HISTORY
|
||||||
|
);
|
||||||
|
constant ENDPOINT_DURABILITY_SERVICE_HISTORY_DEPTH : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
NUM_READERS+7 => std_logic_vector(to_unsigned(10, CDR_LONG_WIDTH)),
|
||||||
|
others => DEFAULT_DURABILITY_SERVICE_HISTORY_DEPTH
|
||||||
|
);
|
||||||
|
constant ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
NUM_READERS+7 => std_logic_vector(to_unsigned(10, CDR_LONG_WIDTH)),
|
||||||
|
others => DEFAULT_DURABILITY_SERVICE_MAX_SAMPLES
|
||||||
|
);
|
||||||
|
constant ENDPOINT_DURABILITY_SERVICE_MAX_INSTANCES : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
NUM_READERS+7 => std_logic_vector(to_unsigned(5, CDR_LONG_WIDTH)),
|
||||||
|
others => DEFAULT_DURABILITY_SERVICE_MAX_INSTANCES
|
||||||
|
);
|
||||||
|
constant ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
NUM_READERS+7 => std_logic_vector(to_unsigned(5, CDR_LONG_WIDTH)),
|
||||||
|
others => DEFAULT_DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE
|
||||||
|
);
|
||||||
-- Array mapping PRESENTATION QoS to Endpoints
|
-- Array mapping PRESENTATION QoS to Endpoints
|
||||||
constant ENDPOINT_PRESENTATION_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_PRESENTATION_QOS);
|
constant ENDPOINT_PRESENTATION_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
constant ENDPOINT_COHERENT_ACCESS : USER_BOOLEAN_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_COHERENT_ACCESS);
|
4 => TOPIC_PRESENTATION_QOS,
|
||||||
constant ENDPOINT_ORDERED_ACCESS : USER_BOOLEAN_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_ORDERED_ACCESS);
|
NUM_READERS+4 => TOPIC_PRESENTATION_QOS,
|
||||||
|
NUM_READERS+5 => TOPIC_PRESENTATION_QOS,
|
||||||
|
others => DEFAULT_PRESENTATION_QOS
|
||||||
|
);
|
||||||
|
constant ENDPOINT_COHERENT_ACCESS : USER_BOOLEAN_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
5 => TRUE,
|
||||||
|
6 => TRUE,
|
||||||
|
NUM_READERS+4 => TRUE,
|
||||||
|
NUM_READERS+5 => TRUE,
|
||||||
|
others => DEFAULT_COHERENT_ACCESS
|
||||||
|
);
|
||||||
|
constant ENDPOINT_ORDERED_ACCESS : USER_BOOLEAN_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
6 => TRUE,
|
||||||
|
NUM_READERS+5 => TRUE,
|
||||||
|
others => DEFAULT_ORDERED_ACCESS
|
||||||
|
);
|
||||||
-- Array mapping DEADLINE QoS to Endpoints
|
-- Array mapping DEADLINE QoS to Endpoints
|
||||||
constant ENDPOINT_DEADLINE_QOS : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_DEADLINE_QOS);
|
constant ENDPOINT_DEADLINE_QOS : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
7 => gen_duration(10,0),
|
||||||
|
8 => gen_duration(20,0),
|
||||||
|
NUM_READERS+4 => gen_duration(15,0),
|
||||||
|
others => DEFAULT_DEADLINE_QOS
|
||||||
|
);
|
||||||
-- Array mapping LATENCY_BUDGET QoS to Endpoints
|
-- Array mapping LATENCY_BUDGET QoS to Endpoints
|
||||||
constant ENDPOINT_LATENCY_BUDGET_QOS : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_LATENCY_BUDGET_QOS);
|
constant ENDPOINT_LATENCY_BUDGET_QOS : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
9 => gen_duration(0,500000000),
|
||||||
|
10 => gen_duration(2,0),
|
||||||
|
NUM_READERS+6 => gen_duration(1,0),
|
||||||
|
others => DEFAULT_LATENCY_BUDGET_QOS
|
||||||
|
);
|
||||||
-- Array mapping OWNERSHIP QoS to Endpoints
|
-- Array mapping OWNERSHIP QoS to Endpoints
|
||||||
constant ENDPOINT_OWNERSHIP_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_OWNERSHIP_QOS);
|
constant ENDPOINT_OWNERSHIP_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
others => DEFAULT_OWNERSHIP_QOS
|
||||||
|
);
|
||||||
-- Array mapping OWNERSHIP_STRENGTH QoS to Endpoints (Only relevant to Writers)
|
-- Array mapping OWNERSHIP_STRENGTH QoS to Endpoints (Only relevant to Writers)
|
||||||
constant ENDPOINT_OWNERSHIP_STRENGTH_QOS : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_OWNERSHIP_STRENGTH_QOS);
|
constant ENDPOINT_OWNERSHIP_STRENGTH_QOS : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
NUM_READERS+7 => std_logic_vector(to_unsigned(2, CDR_LONG_WIDTH)),
|
||||||
|
others => DEFAULT_OWNERSHIP_STRENGTH_QOS
|
||||||
|
);
|
||||||
-- Array mapping LIVELINESS QoS to Endpoints
|
-- Array mapping LIVELINESS QoS to Endpoints
|
||||||
constant ENDPOINT_LIVELINESS_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_LIVELINESS_QOS);
|
constant ENDPOINT_LIVELINESS_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
constant ENDPOINT_LEASE_DURATION : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_LEASE_DURATION);
|
11 => MANUAL_BY_PARTICIPANT_LIVELINESS_QOS,
|
||||||
|
12 => MANUAL_BY_TOPIC_LIVELINESS_QOS,
|
||||||
|
NUM_READERS+4 => MANUAL_BY_PARTICIPANT_LIVELINESS_QOS,
|
||||||
|
others => DEFAULT_LIVELINESS_QOS
|
||||||
|
);
|
||||||
|
constant ENDPOINT_LEASE_DURATION : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
11 => gen_duration(20,0),
|
||||||
|
12 => gen_duration(20,0),
|
||||||
|
13 => gen_duration(10,0),
|
||||||
|
14 => gen_duration(20,0),
|
||||||
|
NUM_READERS+4 => gen_duration(15,0),
|
||||||
|
others => DEFAULT_LEASE_DURATION
|
||||||
|
);
|
||||||
-- Array mapping TIME_BASED_FILTER QoS to Endpoints (Only relevant to Readers)
|
-- Array mapping TIME_BASED_FILTER QoS to Endpoints (Only relevant to Readers)
|
||||||
constant ENDPOINT_TIME_BASED_FILTER_QOS : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_TIME_BASED_FILTER_QOS);
|
constant ENDPOINT_TIME_BASED_FILTER_QOS : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
7 => gen_duration(5,0),
|
||||||
|
8 => gen_duration(5,0),
|
||||||
|
others => DEFAULT_TIME_BASED_FILTER_QOS
|
||||||
|
);
|
||||||
-- XXX: PARTITION QoS Ignored
|
-- XXX: PARTITION QoS Ignored
|
||||||
-- Array mapping RELIABILITY QoS to Endpoints
|
-- Array mapping RELIABILITY QoS to Endpoints
|
||||||
constant ENDPOINT_RELIABILITY_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_RELIABILTY_QOS);
|
constant ENDPOINT_RELIABILITY_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
15 => BEST_EFFORT_RELIABILITY_QOS,
|
||||||
|
NUM_READERS+3 => BEST_EFFORT_RELIABILITY_QOS,
|
||||||
|
others => DEFAULT_RELIABILTY_QOS
|
||||||
|
);
|
||||||
-- (Only relevant to Writers)
|
-- (Only relevant to Writers)
|
||||||
constant ENDPOINT_MAX_BLOCKING_TIME : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_MAX_BLOCKING_TIME);
|
constant ENDPOINT_MAX_BLOCKING_TIME : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
NUM_READERS+7 => gen_duration(2,0),
|
||||||
|
others => DEFAULT_MAX_BLOCKING_TIME
|
||||||
|
);
|
||||||
-- Array mapping TRANSPORT_PRIORITY QoS to Endpoints (Only relevant to Writers)
|
-- Array mapping TRANSPORT_PRIORITY QoS to Endpoints (Only relevant to Writers)
|
||||||
constant ENDPOINT_TRANSPORT_PRIORITY_QOS : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_TRANSPORT_PRIORITY_QOS);
|
constant ENDPOINT_TRANSPORT_PRIORITY_QOS : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
NUM_READERS+7 => std_logic_vector(to_unsigned(3, CDR_LONG_WIDTH)),
|
||||||
|
others => DEFAULT_TRANSPORT_PRIORITY_QOS
|
||||||
|
);
|
||||||
-- Array mapping LIFESPAN QoS to Endpoints (Only relevant to Writers)
|
-- Array mapping LIFESPAN QoS to Endpoints (Only relevant to Writers)
|
||||||
constant ENDPOINT_LIFESPAN_QOS : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_LIFESPAN_QOS);
|
constant ENDPOINT_LIFESPAN_QOS : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
NUM_READERS+7 => gen_duration(30,0),
|
||||||
|
others => DEFAULT_LIFESPAN_QOS
|
||||||
|
);
|
||||||
-- Array mapping DESTINATION_ORDER QoS to Endpoints
|
-- Array mapping DESTINATION_ORDER QoS to Endpoints
|
||||||
constant ENDPOINT_DESTINATION_ORDER_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_DESTINATION_ORDER_QOS);
|
constant ENDPOINT_DESTINATION_ORDER_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (
|
||||||
|
16 => BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS,
|
||||||
|
NUM_READERS+4 => BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS,
|
||||||
|
others => DEFAULT_DESTINATION_ORDER_QOS
|
||||||
|
);
|
||||||
-- Array mapping HISTORY QoS to Endpoints
|
-- Array mapping HISTORY QoS to Endpoints
|
||||||
constant ENDPOINT_HISTORY_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_HISTORY_QOS);
|
constant ENDPOINT_HISTORY_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_HISTORY_QOS);
|
||||||
constant ENDPOINT_HISTORY_DEPTH : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_HISTORY_DEPTH);
|
constant ENDPOINT_HISTORY_DEPTH : USER_LONG_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_HISTORY_DEPTH);
|
||||||
@ -120,4 +215,6 @@ package user_config is
|
|||||||
-- NOTE: The buffer will not only store participants, but also endpoint data
|
-- NOTE: The buffer will not only store participants, but also endpoint data
|
||||||
-- Used to determine the size of the builtin endpoint buffer
|
-- Used to determine the size of the builtin endpoint buffer
|
||||||
constant MAX_REMOTE_PARTICIPANTS : natural := 50;
|
constant MAX_REMOTE_PARTICIPANTS : natural := 50;
|
||||||
|
|
||||||
|
constant TEST_STRING : string := "TEST_CONFIG_1";
|
||||||
end package;
|
end package;
|
||||||
@ -10,12 +10,15 @@ analyze ../rtps_config_package.vhd
|
|||||||
analyze ../rtps_test_package.vhd
|
analyze ../rtps_test_package.vhd
|
||||||
analyze ../rtps_handler.vhd
|
analyze ../rtps_handler.vhd
|
||||||
analyze ../rtps_builtin_endpoint.vhd
|
analyze ../rtps_builtin_endpoint.vhd
|
||||||
analyze test_ram.vhd
|
|
||||||
analyze ScoreBoard_test_memory.vhd
|
|
||||||
analyze Level_0/rtps_handler_test1.vhd
|
analyze Level_0/rtps_handler_test1.vhd
|
||||||
analyze Level_0/rtps_handler_test2.vhd
|
analyze Level_0/rtps_handler_test2.vhd
|
||||||
|
analyze test_ram.vhd
|
||||||
|
analyze ScoreBoard_test_memory.vhd
|
||||||
analyze Level_0/rtps_builtin_endpoint_test1.vhd
|
analyze Level_0/rtps_builtin_endpoint_test1.vhd
|
||||||
|
analyze ScoreBoard_builtin_endpoint.vhd
|
||||||
|
analyze Level_0/rtps_builtin_endpoint_test2.vhd
|
||||||
|
|
||||||
#simulate rtps_handler_test1
|
#simulate rtps_handler_test1
|
||||||
#simulate rtps_handler_test2
|
#simulate rtps_handler_test2
|
||||||
simulate rtps_builtin_endpoint_test1
|
#simulate rtps_builtin_endpoint_test1
|
||||||
|
simulate rtps_builtin_endpoint_test2
|
||||||
@ -10,6 +10,7 @@ use work.rtps_config_package.all;
|
|||||||
-- TODO: Initialise RAM to zeroes
|
-- TODO: Initialise RAM to zeroes
|
||||||
-- TODO: Skip Packet while we are waiting for memory operation to complete
|
-- TODO: Skip Packet while we are waiting for memory operation to complete
|
||||||
-- TODO: add_res is still valid after removal. So we could continue searching the next orphan endpoint from that address on
|
-- TODO: add_res is still valid after removal. So we could continue searching the next orphan endpoint from that address on
|
||||||
|
-- TODO: is it really necessary to process Sequence Numbers in sequence? Could we not just accept any higher Sequence Number?
|
||||||
|
|
||||||
entity rtps_builtin_endpoint is
|
entity rtps_builtin_endpoint is
|
||||||
port (
|
port (
|
||||||
@ -60,9 +61,9 @@ architecture arch of rtps_builtin_endpoint is
|
|||||||
--*****TYPE DECLARATION*****
|
--*****TYPE DECLARATION*****
|
||||||
-- FSM states. Explained below in detail
|
-- FSM states. Explained below in detail
|
||||||
type STAGE_TYPE is (IDLE, PACKET_HEADER, PACKET_SRC_ADDR, PACKET_SRC_ENTITYID, PACKET_SRC_GUIDPREFIX, PACKET_DEST_ENTITYID,
|
type STAGE_TYPE is (IDLE, PACKET_HEADER, PACKET_SRC_ADDR, PACKET_SRC_ENTITYID, PACKET_SRC_GUIDPREFIX, PACKET_DEST_ENTITYID,
|
||||||
CHECK_SRC_ENTITYID, LATCH_SEQ_NR, PROCESS_DATA, PROCESS_MESSAGE, PROCESS_GAP, PROCESS_GAP_SEQUENCE_NUMBERS, PROCESS_PL,
|
CHECK_SRC_ENTITYID, LATCH_SEQ_NR, PROCESS_DATA, PROCESS_MESSAGE, PROCESS_GAP, PROCESS_GAP_SEQUENCE_NUMBERS, PROCESS_PL, CHECK_DEFAULT,
|
||||||
LATCH_STRING_LENGTH, COMPARE_STRING, RXO_DURABILITY, RXO_DEADLINE, RXO_LIVELINESS, RXO_LEASE_DURATION, LATCH_LEASE_DURATION,
|
LATCH_STRING_LENGTH, COMPARE_STRING, RXO_DURABILITY, RXO_DEADLINE, RXO_LIVELINESS, RXO_LEASE_DURATION, LATCH_LEASE_DURATION,
|
||||||
RXO_RELIABILITY, RXO_DESTINATION_ORDER, RXO_OWNERSHIP, RXO_PRESENTATION, RXO_PARTITION, MATCH_DOMAIN_ID, MATCH_PROTOCOL_VERSION,
|
RXO_RELIABILITY, RXO_DESTINATION_ORDER, RXO_OWNERSHIP, RXO_PRESENTATION, RXO_PARTITION, RXO_LATENCY_BUDGET, CHECK_MAX_SIZE_SERIALIZED, MATCH_DOMAIN_ID, MATCH_PROTOCOL_VERSION,
|
||||||
LATCH_LOCATOR, LATCH_EXPECTS_INLINE_QOS, MATCH_GUID, CHECK_REMOTE_BUILTIN_ENDPOINTS, PARTICIPANT_MATCH_STAGE,
|
LATCH_LOCATOR, LATCH_EXPECTS_INLINE_QOS, MATCH_GUID, CHECK_REMOTE_BUILTIN_ENDPOINTS, PARTICIPANT_MATCH_STAGE,
|
||||||
INITIATE_ENDPOINT_SEARCH, ENDPOINT_MATCH_STAGE, FIND_ORPHAN_ENDPOINT, PURGE_ORPHAN_ENDPOINT, INFORM_ENDPOINTS_MATCH,
|
INITIATE_ENDPOINT_SEARCH, ENDPOINT_MATCH_STAGE, FIND_ORPHAN_ENDPOINT, PURGE_ORPHAN_ENDPOINT, INFORM_ENDPOINTS_MATCH,
|
||||||
INFORM_ENDPOINTS_UNMATCH, PARTICIPANT_STALE_CHECK, LATCH_REMOVED_GUIDPREFIX, PROCESS_HEARTBEAT, PROCESS_HEARTBEAT_SEQUENCE_NUMBERS,
|
INFORM_ENDPOINTS_UNMATCH, PARTICIPANT_STALE_CHECK, LATCH_REMOVED_GUIDPREFIX, PROCESS_HEARTBEAT, PROCESS_HEARTBEAT_SEQUENCE_NUMBERS,
|
||||||
@ -122,6 +123,8 @@ architecture arch of rtps_builtin_endpoint is
|
|||||||
end record;
|
end record;
|
||||||
|
|
||||||
--*****CONSTANT DECLARATION*****
|
--*****CONSTANT DECLARATION*****
|
||||||
|
-- Max Serialized Payload Size in a UDP Stream (Bytes) [MAX_PAYLAOD(65536) - IPv4_HEADER(20) - UDP_HEADER(8) - RTPS_HEADER(20) - DATA_HEADER(24)]
|
||||||
|
constant UDP_MAX_SIZE_SERIALIZED : natural := 65464;
|
||||||
-- Memory Size in 4-Byte Words
|
-- Memory Size in 4-Byte Words
|
||||||
constant BUILTIN_BUFFER_SIZE : natural := MAX_REMOTE_PARTICIPANTS*PARTICIPANT_FRAME_SIZE;
|
constant BUILTIN_BUFFER_SIZE : natural := MAX_REMOTE_PARTICIPANTS*PARTICIPANT_FRAME_SIZE;
|
||||||
-- Memory Address Width
|
-- Memory Address Width
|
||||||
@ -155,11 +158,34 @@ architecture arch of rtps_builtin_endpoint is
|
|||||||
-- Signifies if the Reader Endpoint expects in-line QoS
|
-- Signifies if the Reader Endpoint expects in-line QoS
|
||||||
constant EXPECTS_INLINE_QOS_FLAG : natural := 0;
|
constant EXPECTS_INLINE_QOS_FLAG : natural := 0;
|
||||||
-- Highest Sequence Number of Publisher Data
|
-- Highest Sequence Number of Publisher Data
|
||||||
constant PUB_SEQUENCENUMBER : SEQUENCENUMBER_TYPE := convert_to_double_word(to_unsigned(NUM_WRITERS, 64));
|
constant PUB_SEQUENCENUMBER : SEQUENCENUMBER_TYPE := convert_to_double_word(to_unsigned(NUM_WRITERS, 64));
|
||||||
-- Highest Sequence Number of Subscriber Data
|
-- Highest Sequence Number of Subscriber Data
|
||||||
constant SUB_SEQUENCENUMBER : SEQUENCENUMBER_TYPE := convert_to_double_word(to_unsigned(NUM_READERS, 64));
|
constant SUB_SEQUENCENUMBER : SEQUENCENUMBER_TYPE := convert_to_double_word(to_unsigned(NUM_READERS, 64));
|
||||||
-- Heartbeat/Liveliness Assertion Period
|
-- Heartbeat/Liveliness Assertion Period
|
||||||
constant HEARTBEAT_PERIOD : DURATION_TYPE := work.rtps_package.min(MIN_ENDPOINT_LEASE_DURATION, PARTICIPANT_HEARTBEAT_PERIOD) - DURATION_DELTA;
|
constant HEARTBEAT_PERIOD : DURATION_TYPE := work.rtps_package.min(MIN_ENDPOINT_LEASE_DURATION, PARTICIPANT_HEARTBEAT_PERIOD) - DURATION_DELTA;
|
||||||
|
-- *RECV FLAGS*
|
||||||
|
-- Width of the received array
|
||||||
|
constant RCVD_WIDTH : natural := 9;
|
||||||
|
-- Signifies that the DOMAIN_TAG was received
|
||||||
|
constant DOMAIN_TAG_RCVD : natural := 0;
|
||||||
|
-- Signifies that the DURABILITY QoS was received
|
||||||
|
constant DURABILITY_QOS_RCVD_FLAG : natural := 1;
|
||||||
|
-- Signifies that the PRESENTATION QoS was received
|
||||||
|
constant PRESENTATION_QOS_RCVD_FLAG : natural := 2;
|
||||||
|
-- Signifies that the DEADLINE QoS was received
|
||||||
|
constant DEADLINE_QOS_RCVD_FLAG : natural := 3;
|
||||||
|
-- Signifies that the LATENCY_BUDGET QoS was received
|
||||||
|
constant LATENCY_BUDGET_QOS_RCVD_FLAG : natural := 4;
|
||||||
|
-- Signifies that the OWNERSHIP QoS was received
|
||||||
|
constant OWNERSHIP_QOS_RCVD_FLAG : natural := 5;
|
||||||
|
-- Signifies that the LIVELINESS QoS was received
|
||||||
|
constant LIVELINESS_QOS_RCVD_FLAG : natural := 6;
|
||||||
|
-- Signifies that the RELIABILITY QoS was received
|
||||||
|
constant RELIABILITY_QOS_RCVD_FLAG : natural := 7;
|
||||||
|
-- Signifies that the DESTINATION_ORDER QoS was received
|
||||||
|
constant DESTINATION_ORDER_QOS_RCVD_FLAG : natural := 8;
|
||||||
|
|
||||||
|
|
||||||
-- Constant for zero Participant Data
|
-- Constant for zero Participant Data
|
||||||
constant ZERO_PARTICIPANT_DATA : PARTICIPANT_DATA_TYPE := (
|
constant ZERO_PARTICIPANT_DATA : PARTICIPANT_DATA_TYPE := (
|
||||||
meta_addr => (others => '0'),
|
meta_addr => (others => '0'),
|
||||||
@ -282,8 +308,8 @@ architecture arch of rtps_builtin_endpoint is
|
|||||||
signal reset_max_pointer, reset_max_pointer_next : std_logic := '0';
|
signal reset_max_pointer, reset_max_pointer_next : std_logic := '0';
|
||||||
-- Signifies if we currently are doing a Participant Stale Entry Check (Used to start Stale Checks between packet handling)
|
-- Signifies if we currently are doing a Participant Stale Entry Check (Used to start Stale Checks between packet handling)
|
||||||
signal stale_check, stale_check_next : std_logic := '0';
|
signal stale_check, stale_check_next : std_logic := '0';
|
||||||
-- Latch containing the GUID Prefix of the removed Participant from the memory
|
-- Latch containing the GUID Prefix of the removed Participant from the memory, and the Enity ID of the last Orphan Endpoint found
|
||||||
signal mem_guidprefix, mem_guidprefix_next : GUIDPREFIX_TYPE := (others => (others => '0'));
|
signal mem_guid, mem_guid_next : GUID_TYPE := (others => (others => '0'));
|
||||||
-- Toggle latching the "last_word_in" signal until reset
|
-- Toggle latching the "last_word_in" signal until reset
|
||||||
signal last_word_in_latch, last_word_in_latch_next : std_logic := '0';
|
signal last_word_in_latch, last_word_in_latch_next : std_logic := '0';
|
||||||
-- Flags signifying which parts of the participant Data stored in memory to update
|
-- Flags signifying which parts of the participant Data stored in memory to update
|
||||||
@ -333,9 +359,9 @@ architecture arch of rtps_builtin_endpoint is
|
|||||||
signal extra_flags, extra_flags_next : std_logic_vector(EXTRA_FLAGS_WIDTH-1 downto 0) := (others => '0');
|
signal extra_flags, extra_flags_next : std_logic_vector(EXTRA_FLAGS_WIDTH-1 downto 0) := (others => '0');
|
||||||
-- General Purpose Long latch
|
-- General Purpose Long latch
|
||||||
signal long_latch, long_latch_next : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0');
|
signal long_latch, long_latch_next : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0');
|
||||||
-- Signifies if the Participant Domain Tag was checked/matched
|
-- Contains flags that signify which PIDs where received. This is done in order to use the default value for
|
||||||
-- NOTE: Because the Domain Tag has a default value, we have to note if we received a PID_DOMAIN_TAG (since the default value is implied on its absence)
|
-- not received elements.
|
||||||
signal domain_tag_rcv, domain_tag_rcv_next : std_logic := '0';
|
signal rcvd, rcvd_next : std_logic_vector(RCVD_WIDTH-1 downto 0) := (others => '0');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -526,6 +552,7 @@ begin
|
|||||||
-- FIND_ORPHAN_ENDPOINT Search for Orphan (whose parent Participant was removed) Endpoints in memory
|
-- FIND_ORPHAN_ENDPOINT Search for Orphan (whose parent Participant was removed) Endpoints in memory
|
||||||
-- PURGE_ORPHAN_ENDPOINT Remove Orphan Endpoint from memory
|
-- PURGE_ORPHAN_ENDPOINT Remove Orphan Endpoint from memory
|
||||||
-- PROCESS_PL Parse RTPS Parameter List
|
-- PROCESS_PL Parse RTPS Parameter List
|
||||||
|
-- CHECK_DEFAULT Match local endpoints against non-received QoS (default values) of remote
|
||||||
-- LATCH_STRING_LENGTH Store String Length
|
-- LATCH_STRING_LENGTH Store String Length
|
||||||
-- COMPARE_STRING Compare string to constants depending on string contents.
|
-- COMPARE_STRING Compare string to constants depending on string contents.
|
||||||
-- MATCH_GUID Compare GUID Prefix to source GUID Prefix of Packet
|
-- MATCH_GUID Compare GUID Prefix to source GUID Prefix of Packet
|
||||||
@ -544,6 +571,8 @@ begin
|
|||||||
-- RXO_OWNERSHIP Check Compatibility of Ownership QoS
|
-- RXO_OWNERSHIP Check Compatibility of Ownership QoS
|
||||||
-- RXO_PRESENTATION Check Compatibility of Presentation QoS
|
-- RXO_PRESENTATION Check Compatibility of Presentation QoS
|
||||||
-- RXO_PARTITION Check Compatibility of Partition QoS
|
-- RXO_PARTITION Check Compatibility of Partition QoS
|
||||||
|
-- RXO_LATENCY_BUDGET Check Compatibility of Latency Budget QoS
|
||||||
|
-- CHECK_MAX_SIZE_SERIALIZED Check if Publishers Max sent Payload Size is Compatible
|
||||||
-- PARTICIPANT_MATCH_STAGE Add compatible remote and remove incompatible remote Participants to and from memory. Update stored Sequence Numbers respectively
|
-- PARTICIPANT_MATCH_STAGE Add compatible remote and remove incompatible remote Participants to and from memory. Update stored Sequence Numbers respectively
|
||||||
-- INITIATE_ENDPOINT_SEARCH Search for remote Endpoint in memory
|
-- INITIATE_ENDPOINT_SEARCH Search for remote Endpoint in memory
|
||||||
-- ENDPOINT_MATCH_STAGE Add compatible remote and remove incompatible remote Participants to and from memory. Mark compatibility changes to local Endpoints.
|
-- ENDPOINT_MATCH_STAGE Add compatible remote and remove incompatible remote Participants to and from memory. Mark compatibility changes to local Endpoints.
|
||||||
@ -561,8 +590,9 @@ begin
|
|||||||
-- SKIP_PARAMETER Skip rest of Parameter
|
-- SKIP_PARAMETER Skip rest of Parameter
|
||||||
-- SKIP_PACKET Skip rest of Packet
|
-- SKIP_PACKET Skip rest of Packet
|
||||||
parse_prc: process(all)
|
parse_prc: process(all)
|
||||||
variable tmp_endpoint_mask : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
|
variable tmp_endpoint_mask : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
|
||||||
variable rd_guard : std_logic := '0';
|
variable rd_guard : std_logic := '0';
|
||||||
|
variable tmp_default_qos_match : DEFAULT_QOS_MATCH_TYPE := READER_DEFAULT_QOS_MATCH;
|
||||||
begin
|
begin
|
||||||
--DEFAULT Registered
|
--DEFAULT Registered
|
||||||
stage_next <= stage;
|
stage_next <= stage;
|
||||||
@ -613,7 +643,7 @@ begin
|
|||||||
last_word_in_latch_next <= last_word_in_latch;
|
last_word_in_latch_next <= last_word_in_latch;
|
||||||
count_next <= count;
|
count_next <= count;
|
||||||
long_latch_next <= long_latch;
|
long_latch_next <= long_latch;
|
||||||
domain_tag_rcv_next <= domain_tag_rcv;
|
rcvd_next <= rcvd;
|
||||||
-- DEFAULT Unregistered
|
-- DEFAULT Unregistered
|
||||||
rd_sig <= '0';
|
rd_sig <= '0';
|
||||||
rd_guard := '0';
|
rd_guard := '0';
|
||||||
@ -695,8 +725,9 @@ begin
|
|||||||
expects_inline_qos_rcv_next <= '0';
|
expects_inline_qos_rcv_next <= '0';
|
||||||
extra_flags_next <= (others => '0');
|
extra_flags_next <= (others => '0');
|
||||||
extra_flags_next(EXPECTS_INLINE_QOS_FLAG) <= DEFAULT_EXPECTS_INLINE_QOS;
|
extra_flags_next(EXPECTS_INLINE_QOS_FLAG) <= DEFAULT_EXPECTS_INLINE_QOS;
|
||||||
domain_tag_rcv_next <= '0';
|
rcvd_next <= (others => '0');
|
||||||
-- NOTE: We work with a "mark by default, and unmark on first missmatch" System
|
-- NOTE: We work with a "mark by default, and unmark on first missmatch" System.
|
||||||
|
-- This assumes that each RxO QoS parameter occur only once in the list, else the behavior is undefined.
|
||||||
participant_match_next <= '1';
|
participant_match_next <= '1';
|
||||||
endpoint_mask_next <= (others => '1');
|
endpoint_mask_next <= (others => '1');
|
||||||
end if;
|
end if;
|
||||||
@ -1502,9 +1533,9 @@ begin
|
|||||||
when LATCH_REMOVED_GUIDPREFIX =>
|
when LATCH_REMOVED_GUIDPREFIX =>
|
||||||
if (mem_op_done = '1') then
|
if (mem_op_done = '1') then
|
||||||
-- Help Stage needed to latch the GUID Prefix of the removed staled participant (Needed for the orphan search)
|
-- Help Stage needed to latch the GUID Prefix of the removed staled participant (Needed for the orphan search)
|
||||||
guid_next(0) <= mem_guidprefix(0);
|
guid_next(0) <= mem_guid(0);
|
||||||
guid_next(1) <= mem_guidprefix(1);
|
guid_next(1) <= mem_guid(1);
|
||||||
guid_next(2) <= mem_guidprefix(2);
|
guid_next(2) <= mem_guid(2);
|
||||||
stage_next <= FIND_ORPHAN_ENDPOINT;
|
stage_next <= FIND_ORPHAN_ENDPOINT;
|
||||||
end if;
|
end if;
|
||||||
when FIND_ORPHAN_ENDPOINT =>
|
when FIND_ORPHAN_ENDPOINT =>
|
||||||
@ -1524,6 +1555,8 @@ begin
|
|||||||
-- Remove Orphaned Endpoint from Buffer
|
-- Remove Orphaned Endpoint from Buffer
|
||||||
mem_opcode <= REMOVE_ENDPOINT;
|
mem_opcode <= REMOVE_ENDPOINT;
|
||||||
mem_op_start <= '1';
|
mem_op_start <= '1';
|
||||||
|
-- Latch Orphan Entity ID
|
||||||
|
guid_next(3) <= mem_guid(3);
|
||||||
-- Mark UNMATCHES
|
-- Mark UNMATCHES
|
||||||
endpoint_match_next <= (others => '0');
|
endpoint_match_next <= (others => '0');
|
||||||
endpoint_unmatch_next <= convert_from_bitmask_array(endpoint_mask_array, NUM_ENDPOINTS);
|
endpoint_unmatch_next <= convert_from_bitmask_array(endpoint_mask_array, NUM_ENDPOINTS);
|
||||||
@ -1532,6 +1565,8 @@ begin
|
|||||||
cnt_next <= 0;
|
cnt_next <= 0;
|
||||||
-- Buffer has no more Orphans
|
-- Buffer has no more Orphans
|
||||||
else
|
else
|
||||||
|
-- Reset Orphan Search Flag
|
||||||
|
is_orphan_search_next <= '0';
|
||||||
-- DONE
|
-- DONE
|
||||||
stage_next <= SKIP_PACKET;
|
stage_next <= SKIP_PACKET;
|
||||||
end if;
|
end if;
|
||||||
@ -1573,7 +1608,7 @@ begin
|
|||||||
-- Mark String contents (Needed for string comparison)
|
-- Mark String contents (Needed for string comparison)
|
||||||
string_content_next <= DOMAIN_TAG_TYPE;
|
string_content_next <= DOMAIN_TAG_TYPE;
|
||||||
-- Mark reception of DOMAIN_TAG
|
-- Mark reception of DOMAIN_TAG
|
||||||
domain_tag_rcv_next <= '1';
|
rcvd_next(DOMAIN_TAG_RCVD) <= '1';
|
||||||
end if;
|
end if;
|
||||||
when PID_PROTOCOL_VERSION =>
|
when PID_PROTOCOL_VERSION =>
|
||||||
-- Ignore in-line QoS
|
-- Ignore in-line QoS
|
||||||
@ -1653,6 +1688,7 @@ begin
|
|||||||
-- Only relevant for Endpoint Discovery Protocol
|
-- Only relevant for Endpoint Discovery Protocol
|
||||||
if(qos_flag = '0' and message_type = EDP) then
|
if(qos_flag = '0' and message_type = EDP) then
|
||||||
stage_next <= RXO_DURABILITY;
|
stage_next <= RXO_DURABILITY;
|
||||||
|
rcvd_next(DURABILITY_QOS_RCVD_FLAG) <= '1';
|
||||||
end if;
|
end if;
|
||||||
when PID_DEADLINE =>
|
when PID_DEADLINE =>
|
||||||
-- Ignore in-line QoS
|
-- Ignore in-line QoS
|
||||||
@ -1660,30 +1696,35 @@ begin
|
|||||||
if(qos_flag = '0' and message_type = EDP) then
|
if(qos_flag = '0' and message_type = EDP) then
|
||||||
stage_next <= RXO_DEADLINE;
|
stage_next <= RXO_DEADLINE;
|
||||||
cnt_next <= 0;
|
cnt_next <= 0;
|
||||||
|
rcvd_next(DEADLINE_QOS_RCVD_FLAG) <= '1';
|
||||||
end if;
|
end if;
|
||||||
when PID_LIVELINESS =>
|
when PID_LIVELINESS =>
|
||||||
-- Ignore in-line QoS
|
-- Ignore in-line QoS
|
||||||
-- Only relevant for Endpoint Discovery Protocol
|
-- Only relevant for Endpoint Discovery Protocol
|
||||||
if(qos_flag = '0' and message_type = EDP) then
|
if(qos_flag = '0' and message_type = EDP) then
|
||||||
stage_next <= RXO_LIVELINESS;
|
stage_next <= RXO_LIVELINESS;
|
||||||
|
rcvd_next(LIVELINESS_QOS_RCVD_FLAG) <= '1';
|
||||||
end if;
|
end if;
|
||||||
when PID_RELIABILITY =>
|
when PID_RELIABILITY =>
|
||||||
-- Ignore in-line QoS
|
-- Ignore in-line QoS
|
||||||
-- Only relevant for Endpoint Discovery Protocol
|
-- Only relevant for Endpoint Discovery Protocol
|
||||||
if(qos_flag = '0' and message_type = EDP) then
|
if(qos_flag = '0' and message_type = EDP) then
|
||||||
stage_next <= RXO_RELIABILITY;
|
stage_next <= RXO_RELIABILITY;
|
||||||
|
rcvd_next(RELIABILITY_QOS_RCVD_FLAG) <= '1';
|
||||||
end if;
|
end if;
|
||||||
when PID_DESTINATION_ORDER =>
|
when PID_DESTINATION_ORDER =>
|
||||||
-- Ignore in-line QoS
|
-- Ignore in-line QoS
|
||||||
-- Only relevant for Endpoint Discovery Protocol
|
-- Only relevant for Endpoint Discovery Protocol
|
||||||
if(qos_flag = '0' and message_type = EDP) then
|
if(qos_flag = '0' and message_type = EDP) then
|
||||||
stage_next <= RXO_DESTINATION_ORDER;
|
stage_next <= RXO_DESTINATION_ORDER;
|
||||||
|
rcvd_next(DESTINATION_ORDER_QOS_RCVD_FLAG) <= '1';
|
||||||
end if;
|
end if;
|
||||||
when PID_OWNERSHIP =>
|
when PID_OWNERSHIP =>
|
||||||
-- Ignore in-line QoS
|
-- Ignore in-line QoS
|
||||||
-- Only relevant for Endpoint Discovery Protocol
|
-- Only relevant for Endpoint Discovery Protocol
|
||||||
if(qos_flag = '0' and message_type = EDP) then
|
if(qos_flag = '0' and message_type = EDP) then
|
||||||
stage_next <= RXO_OWNERSHIP;
|
stage_next <= RXO_OWNERSHIP;
|
||||||
|
rcvd_next(OWNERSHIP_QOS_RCVD_FLAG) <= '1';
|
||||||
end if;
|
end if;
|
||||||
when PID_PRESENTATION =>
|
when PID_PRESENTATION =>
|
||||||
-- Ignore in-line QoS
|
-- Ignore in-line QoS
|
||||||
@ -1691,6 +1732,7 @@ begin
|
|||||||
if(qos_flag = '0' and message_type = EDP) then
|
if(qos_flag = '0' and message_type = EDP) then
|
||||||
stage_next <= RXO_PRESENTATION;
|
stage_next <= RXO_PRESENTATION;
|
||||||
cnt_next <= 0;
|
cnt_next <= 0;
|
||||||
|
rcvd_next(PRESENTATION_QOS_RCVD_FLAG) <= '1';
|
||||||
end if;
|
end if;
|
||||||
when PID_PARTITION =>
|
when PID_PARTITION =>
|
||||||
-- Ignore in-line QoS
|
-- Ignore in-line QoS
|
||||||
@ -1698,6 +1740,14 @@ begin
|
|||||||
if(qos_flag = '0' and message_type = EDP) then
|
if(qos_flag = '0' and message_type = EDP) then
|
||||||
stage_next <= RXO_PARTITION;
|
stage_next <= RXO_PARTITION;
|
||||||
end if;
|
end if;
|
||||||
|
when PID_LATENCY_BUDGET =>
|
||||||
|
-- Ignore in-line QoS
|
||||||
|
-- Only relevant for Endpoint Discovery Protocol
|
||||||
|
if(qos_flag = '0' and message_type = EDP) then
|
||||||
|
stage_next <= RXO_LATENCY_BUDGET;
|
||||||
|
cnt_next <= 0;
|
||||||
|
rcvd_next(LATENCY_BUDGET_QOS_RCVD_FLAG) <= '1';
|
||||||
|
end if;
|
||||||
when PID_UNICAST_LOCATOR =>
|
when PID_UNICAST_LOCATOR =>
|
||||||
-- Ignore in-line QoS
|
-- Ignore in-line QoS
|
||||||
-- Only relevant for Endpoint Discovery Protocol
|
-- Only relevant for Endpoint Discovery Protocol
|
||||||
@ -1723,6 +1773,12 @@ begin
|
|||||||
stage_next <= MATCH_GUID;
|
stage_next <= MATCH_GUID;
|
||||||
cnt_next <= 0;
|
cnt_next <= 0;
|
||||||
end if;
|
end if;
|
||||||
|
when PID_DATA_MAX_SIZE_SERIALIZED =>
|
||||||
|
-- Ignore in-line QoS
|
||||||
|
-- Only relevant for Endpoint Discovery Protocol
|
||||||
|
if(qos_flag = '0' and message_type = EDP) then
|
||||||
|
stage_next <= CHECK_MAX_SIZE_SERIALIZED;
|
||||||
|
end if;
|
||||||
when PID_EXPECTS_INLINE_QOS =>
|
when PID_EXPECTS_INLINE_QOS =>
|
||||||
stage_next <= LATCH_EXPECTS_INLINE_QOS;
|
stage_next <= LATCH_EXPECTS_INLINE_QOS;
|
||||||
when PID_PARTICIPANT_MANUAL_LIVELINESS_COUNT =>
|
when PID_PARTICIPANT_MANUAL_LIVELINESS_COUNT =>
|
||||||
@ -1737,9 +1793,6 @@ begin
|
|||||||
when PID_PROPERTY_LIST =>
|
when PID_PROPERTY_LIST =>
|
||||||
-- Ignore
|
-- Ignore
|
||||||
null;
|
null;
|
||||||
when PID_DATA_MAX_SIZE_SERIALIZED =>
|
|
||||||
-- Ignore
|
|
||||||
null;
|
|
||||||
when PID_ENTITY_NAME =>
|
when PID_ENTITY_NAME =>
|
||||||
-- Ignore
|
-- Ignore
|
||||||
null;
|
null;
|
||||||
@ -1765,9 +1818,6 @@ begin
|
|||||||
-- Ignore
|
-- Ignore
|
||||||
-- NOTE: Lifespan is requested via in-line QoS and handled directly by the endpoint
|
-- NOTE: Lifespan is requested via in-line QoS and handled directly by the endpoint
|
||||||
null;
|
null;
|
||||||
when PID_LATENCY_BUDGET =>
|
|
||||||
-- Ignore
|
|
||||||
null;
|
|
||||||
when PID_DURABILITY_SERVICE =>
|
when PID_DURABILITY_SERVICE =>
|
||||||
-- Ignore
|
-- Ignore
|
||||||
null;
|
null;
|
||||||
@ -1820,19 +1870,16 @@ begin
|
|||||||
-- Ignore
|
-- Ignore
|
||||||
null;
|
null;
|
||||||
when PID_SENTINEL =>
|
when PID_SENTINEL =>
|
||||||
-- SANITY CHECK: Default DOMAIN TAG Match
|
|
||||||
if (domain_tag_rcv = '0' and DOMAIN_TAG /= DEFAULT_DOMAIN_TAG) then
|
|
||||||
participant_match_next <= '0';
|
|
||||||
end if;
|
|
||||||
-- If Processing in-line QoS until now, start processing data
|
-- If Processing in-line QoS until now, start processing data
|
||||||
if(qos_flag = '1') then
|
if(qos_flag = '1') then
|
||||||
-- Override QoS Flag
|
-- Override QoS Flag
|
||||||
qos_flag_next <= '0';
|
qos_flag_next <= '0';
|
||||||
stage_next <= PROCESS_DATA;
|
stage_next <= PROCESS_DATA;
|
||||||
-- Else check Participant/Endpoint Matching
|
-- Else check Defaults
|
||||||
else
|
else
|
||||||
stage_next <= PARTICIPANT_MATCH_STAGE;
|
stage_next <= CHECK_DEFAULT;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
when PID_LIST_END =>
|
when PID_LIST_END =>
|
||||||
-- TODO
|
-- TODO
|
||||||
null;
|
null;
|
||||||
@ -1846,6 +1893,54 @@ begin
|
|||||||
end if;
|
end if;
|
||||||
end case;
|
end case;
|
||||||
end if;
|
end if;
|
||||||
|
when CHECK_DEFAULT =>
|
||||||
|
-- DEFAULT
|
||||||
|
stage_next <= PARTICIPANT_MATCH_STAGE;
|
||||||
|
|
||||||
|
case (message_type) is
|
||||||
|
when PDP =>
|
||||||
|
-- Check Domain Tag against Default if necessary
|
||||||
|
if (rcvd(DOMAIN_TAG_RCVD) = '0' and DOMAIN_TAG /= DEFAULT_DOMAIN_TAG) then
|
||||||
|
participant_match_next <= '0';
|
||||||
|
end if;
|
||||||
|
when EDP =>
|
||||||
|
-- Defaults
|
||||||
|
tmp_endpoint_mask := (others => '1');
|
||||||
|
if (is_subscriber = '1') then
|
||||||
|
tmp_default_qos_match := READER_DEFAULT_QOS_MATCH;
|
||||||
|
else
|
||||||
|
tmp_default_qos_match := WRITER_DEFAULT_QOS_MATCH;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if (rcvd(DURABILITY_QOS_RCVD_FLAG) = '0') then
|
||||||
|
tmp_endpoint_mask := tmp_endpoint_mask and tmp_default_qos_match.DURABILITY_QOS;
|
||||||
|
end if;
|
||||||
|
if (rcvd(PRESENTATION_QOS_RCVD_FLAG) = '0') then
|
||||||
|
tmp_endpoint_mask := tmp_endpoint_mask and tmp_default_qos_match.PRESENTATION_QOS;
|
||||||
|
end if;
|
||||||
|
if (rcvd(DEADLINE_QOS_RCVD_FLAG) = '0') then
|
||||||
|
tmp_endpoint_mask := tmp_endpoint_mask and tmp_default_qos_match.DEADLINE_QOS;
|
||||||
|
end if;
|
||||||
|
if (rcvd(LATENCY_BUDGET_QOS_RCVD_FLAG) = '0') then
|
||||||
|
tmp_endpoint_mask := tmp_endpoint_mask and tmp_default_qos_match.LATENCY_BUDGET_QOS;
|
||||||
|
end if;
|
||||||
|
if (rcvd(OWNERSHIP_QOS_RCVD_FLAG) = '0') then
|
||||||
|
tmp_endpoint_mask := tmp_endpoint_mask and tmp_default_qos_match.OWNERSHIP_QOS;
|
||||||
|
end if;
|
||||||
|
if (rcvd(LIVELINESS_QOS_RCVD_FLAG) = '0') then
|
||||||
|
tmp_endpoint_mask := tmp_endpoint_mask and tmp_default_qos_match.LIVELINESS_QOS;
|
||||||
|
end if;
|
||||||
|
if (rcvd(RELIABILITY_QOS_RCVD_FLAG) = '0') then
|
||||||
|
tmp_endpoint_mask := tmp_endpoint_mask and tmp_default_qos_match.RELIABILITY_QOS;
|
||||||
|
end if;
|
||||||
|
if (rcvd(DESTINATION_ORDER_QOS_RCVD_FLAG) = '0') then
|
||||||
|
tmp_endpoint_mask := tmp_endpoint_mask and tmp_default_qos_match.DESTINATION_ORDER_QOS;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
endpoint_mask_next <= endpoint_mask and tmp_endpoint_mask;
|
||||||
|
when others =>
|
||||||
|
null;
|
||||||
|
end case;
|
||||||
when LATCH_STRING_LENGTH =>
|
when LATCH_STRING_LENGTH =>
|
||||||
-- Input FIFO Guard
|
-- Input FIFO Guard
|
||||||
if (empty = '0') then
|
if (empty = '0') then
|
||||||
@ -2062,16 +2157,8 @@ begin
|
|||||||
-- Check QoS Compatibility (Unmark match on incompatibility)
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
-- COMPATIBLE (DDS v1.4): offered >= requested, with VOLATILE < TRANSIENT_LOCAL < TRANSIENT < PERSISTENT
|
-- COMPATIBLE (DDS v1.4): offered >= requested, with VOLATILE < TRANSIENT_LOCAL < TRANSIENT < PERSISTENT
|
||||||
for i in 0 to NUM_ENDPOINTS-1 loop
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
-- data-in is Subscriber-Requested
|
if (not check_qos_compatibility(is_subscriber, '1', unsigned(data_in_swapped), unsigned(ENDPOINT_DURABILITY_QOS(i)))) then
|
||||||
if (is_subscriber = '1') then
|
endpoint_mask_next(i) <= '0';
|
||||||
if (unsigned(data_in_swapped) > unsigned(ENDPOINT_DURABILITY_QOS(i))) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
-- data-in is Publisher-Offered
|
|
||||||
else
|
|
||||||
if (unsigned(data_in_swapped) < unsigned(ENDPOINT_DURABILITY_QOS(i))) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
-- DONE
|
-- DONE
|
||||||
@ -2088,32 +2175,16 @@ begin
|
|||||||
-- Check QoS Compatibility (Unmark match on incompatibility)
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
-- COMPATIBLE (DDS v1.4): offered <= requested
|
-- COMPATIBLE (DDS v1.4): offered <= requested
|
||||||
for i in 0 to NUM_ENDPOINTS-1 loop
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
-- data-in is Subscriber-Requested
|
if (not check_qos_compatibility(is_subscriber, '0', unsigned(data_in_swapped), ENDPOINT_DEADLINE_QOS(i)(0))) then
|
||||||
if (is_subscriber = '1') then
|
endpoint_mask_next(i) <= '0';
|
||||||
if (unsigned(data_in_swapped) < ENDPOINT_DEADLINE_QOS(i)(0)) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
-- data-in is Publisher-Offered
|
|
||||||
else
|
|
||||||
if (unsigned(data_in_swapped) > ENDPOINT_DEADLINE_QOS(i)(0)) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
when 1 =>
|
when 1 =>
|
||||||
-- Check QoS Compatibility (Unmark match on incompatibility)
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
-- COMPATIBLE (DDS v1.4): offered <= requested
|
-- COMPATIBLE (DDS v1.4): offered <= requested
|
||||||
for i in 0 to NUM_ENDPOINTS-1 loop
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
-- data-in is Subscriber-Requested
|
if (not check_qos_compatibility(is_subscriber, '0', unsigned(data_in_swapped), ENDPOINT_DEADLINE_QOS(i)(1))) then
|
||||||
if (is_subscriber = '1') then
|
endpoint_mask_next(i) <= '0';
|
||||||
if (unsigned(data_in_swapped) < ENDPOINT_DEADLINE_QOS(i)(1)) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
-- data-in is Publisher-Offered
|
|
||||||
else
|
|
||||||
if (unsigned(data_in_swapped) > ENDPOINT_DEADLINE_QOS(i)(1)) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
-- DONE
|
-- DONE
|
||||||
@ -2130,16 +2201,8 @@ begin
|
|||||||
-- Check QoS Compatibility (Unmark match on incompatibility)
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
-- COMPATIBLE (DDS v1.4): offered >= requested, with AUTOMATIC < MANUAL_BY_PARTICIPANT < MANUAL_BY_TOPIC
|
-- COMPATIBLE (DDS v1.4): offered >= requested, with AUTOMATIC < MANUAL_BY_PARTICIPANT < MANUAL_BY_TOPIC
|
||||||
for i in 0 to NUM_ENDPOINTS-1 loop
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
-- data-in is Subscriber-Requested
|
if (not check_qos_compatibility(is_subscriber, '1', unsigned(data_in_swapped), unsigned(ENDPOINT_LIVELINESS_QOS(i)))) then
|
||||||
if (is_subscriber = '1') then
|
endpoint_mask_next(i) <= '0';
|
||||||
if (unsigned(data_in_swapped) > unsigned(ENDPOINT_LIVELINESS_QOS(i))) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
-- data-in is Publisher-Offered
|
|
||||||
else
|
|
||||||
if (unsigned(data_in_swapped) < unsigned(ENDPOINT_LIVELINESS_QOS(i))) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
|
|
||||||
@ -2157,32 +2220,16 @@ begin
|
|||||||
-- Check QoS Compatibility (Unmark match on incompatibility)
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
-- COMPATIBLE (DDS v1.4): offered <= requested
|
-- COMPATIBLE (DDS v1.4): offered <= requested
|
||||||
for i in 0 to NUM_ENDPOINTS-1 loop
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
-- data-in is Subscriber-Requested
|
if (not check_qos_compatibility(is_subscriber, '0', unsigned(data_in_swapped), ENDPOINT_LEASE_DURATION(i)(0))) then
|
||||||
if (is_subscriber = '1') then
|
endpoint_mask_next(i) <= '0';
|
||||||
if (unsigned(data_in_swapped) > ENDPOINT_LEASE_DURATION(i)(0)) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
-- data-in is Publisher-Offered
|
|
||||||
else
|
|
||||||
if (unsigned(data_in_swapped) < ENDPOINT_LEASE_DURATION(i)(0)) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
when 1 =>
|
when 1 =>
|
||||||
-- Check QoS Compatibility (Unmark match on incompatibility)
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
-- COMPATIBLE (DDS v1.4): offered <= requested
|
-- COMPATIBLE (DDS v1.4): offered <= requested
|
||||||
for i in 0 to NUM_ENDPOINTS-1 loop
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
-- data-in is Subscriber-Requested
|
if (not check_qos_compatibility(is_subscriber, '0', unsigned(data_in_swapped), ENDPOINT_LEASE_DURATION(i)(1))) then
|
||||||
if (is_subscriber = '1') then
|
endpoint_mask_next(i) <= '0';
|
||||||
if (unsigned(data_in_swapped) > ENDPOINT_LEASE_DURATION(i)(1)) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
-- data-in is Publisher-Offered
|
|
||||||
else
|
|
||||||
if (unsigned(data_in_swapped) < ENDPOINT_LEASE_DURATION(i)(1)) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
-- DONE
|
-- DONE
|
||||||
@ -2199,16 +2246,8 @@ begin
|
|||||||
-- Check QoS Compatibility (Unmark match on incompatibility)
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
-- COMPATIBLE (DDS v1.4): offered >= requested, with BEST_EFFORT < RELIABLE
|
-- COMPATIBLE (DDS v1.4): offered >= requested, with BEST_EFFORT < RELIABLE
|
||||||
for i in 0 to NUM_ENDPOINTS-1 loop
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
-- data-in is Subscriber-Requested
|
if (not check_qos_compatibility(is_subscriber, '1', unsigned(data_in_swapped), unsigned(ENDPOINT_RELIABILITY_QOS(i)))) then
|
||||||
if (is_subscriber = '1') then
|
endpoint_mask_next(i) <= '0';
|
||||||
if (unsigned(data_in_swapped) > unsigned(ENDPOINT_RELIABILITY_QOS(i))) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
-- data-in is Publisher-Offered
|
|
||||||
else
|
|
||||||
if (unsigned(data_in_swapped) < unsigned(ENDPOINT_RELIABILITY_QOS(i))) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
|
|
||||||
@ -2224,16 +2263,8 @@ begin
|
|||||||
-- Check QoS Compatibility (Unmark match on incompatibility)
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
-- COMPATIBLE (DDS v1.4): offered >= requested, with BY_RECEPTION_TIMESTAMP < BY_SOURCE_TIMESTAMP
|
-- COMPATIBLE (DDS v1.4): offered >= requested, with BY_RECEPTION_TIMESTAMP < BY_SOURCE_TIMESTAMP
|
||||||
for i in 0 to NUM_ENDPOINTS-1 loop
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
-- data-in is Subscriber-Requested
|
if (not check_qos_compatibility(is_subscriber, '1', unsigned(data_in_swapped), unsigned(ENDPOINT_DESTINATION_ORDER_QOS(i)))) then
|
||||||
if (is_subscriber = '1') then
|
endpoint_mask_next(i) <= '0';
|
||||||
if (unsigned(data_in_swapped) > unsigned(ENDPOINT_DESTINATION_ORDER_QOS(i))) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
-- data-in is Publisher-Offered
|
|
||||||
else
|
|
||||||
if (unsigned(data_in_swapped) < unsigned(ENDPOINT_DESTINATION_ORDER_QOS(i))) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
-- DONE
|
-- DONE
|
||||||
@ -2244,12 +2275,13 @@ begin
|
|||||||
if (empty = '0') then
|
if (empty = '0') then
|
||||||
rd_guard := '1';
|
rd_guard := '1';
|
||||||
|
|
||||||
-- NOTE: Currently we only support Shared Ownership
|
|
||||||
-- Check QoS Compatibility (Unmark match on incompatibility)
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
-- COMPATIBLE (DDS v1.4): offered = requested
|
-- COMPATIBLE (DDS v1.4): offered = requested
|
||||||
if (data_in_swapped /= SHARED_OWNERSHIP_QOS) then
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
endpoint_mask_next <= (others => '0');
|
if (data_in_swapped /= ENDPOINT_OWNERSHIP_QOS(i)) then
|
||||||
end if;
|
endpoint_mask_next(i) <= '0';
|
||||||
|
end if;
|
||||||
|
end loop;
|
||||||
-- DONE
|
-- DONE
|
||||||
stage_next <= SKIP_PARAMETER;
|
stage_next <= SKIP_PARAMETER;
|
||||||
end if;
|
end if;
|
||||||
@ -2264,16 +2296,8 @@ begin
|
|||||||
-- Check QoS Compatibility (Unmark match on incompatibility)
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
-- COMPATIBLE (DDS v1.4): offered >= requested, with INSTANCE < TOPIC < GROUP
|
-- COMPATIBLE (DDS v1.4): offered >= requested, with INSTANCE < TOPIC < GROUP
|
||||||
for i in 0 to NUM_ENDPOINTS-1 loop
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
-- data-in is Subscriber-Requested
|
if (not check_qos_compatibility(is_subscriber, '1', unsigned(data_in_swapped), unsigned(ENDPOINT_PRESENTATION_QOS(i)))) then
|
||||||
if (is_subscriber = '1') then
|
endpoint_mask_next(i) <= '0';
|
||||||
if (unsigned(data_in_swapped) > unsigned(ENDPOINT_PRESENTATION_QOS(i))) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
-- data-in is Publisher-Offered
|
|
||||||
else
|
|
||||||
if (unsigned(data_in_swapped) < unsigned(ENDPOINT_PRESENTATION_QOS(i))) then
|
|
||||||
endpoint_mask_next(i) <= '0';
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
when 1 =>
|
when 1 =>
|
||||||
@ -2282,10 +2306,18 @@ begin
|
|||||||
-- data-in is Subscriber-Requested
|
-- data-in is Subscriber-Requested
|
||||||
-- COMPATIBLE (DDS v1.4): requested=FALSE or requested=offered=TRUE
|
-- COMPATIBLE (DDS v1.4): requested=FALSE or requested=offered=TRUE
|
||||||
if (is_subscriber = '1') then
|
if (is_subscriber = '1') then
|
||||||
if (data_in(23) = '1' and ENDPOINT_COHERENT_ACCESS(i) = FALSE) then
|
if (data_in(24) = '1' and not ENDPOINT_COHERENT_ACCESS(i)) then
|
||||||
endpoint_mask_next(i) <= '0';
|
endpoint_mask_next(i) <= '0';
|
||||||
end if;
|
end if;
|
||||||
if (data_in(15) = '1' and ENDPOINT_ORDERED_ACCESS(i) = FALSE) then
|
if (data_in(16) = '1' and not ENDPOINT_ORDERED_ACCESS(i)) then
|
||||||
|
endpoint_mask_next(i) <= '0';
|
||||||
|
end if;
|
||||||
|
-- data-in is Publisher-Offered
|
||||||
|
else
|
||||||
|
if (data_in(24) = '0' and ENDPOINT_COHERENT_ACCESS(i)) then
|
||||||
|
endpoint_mask_next(i) <= '0';
|
||||||
|
end if;
|
||||||
|
if (data_in(16) = '0' and ENDPOINT_ORDERED_ACCESS(i)) then
|
||||||
endpoint_mask_next(i) <= '0';
|
endpoint_mask_next(i) <= '0';
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
@ -2309,6 +2341,47 @@ begin
|
|||||||
-- DONE
|
-- DONE
|
||||||
stage_next <= SKIP_PARAMETER;
|
stage_next <= SKIP_PARAMETER;
|
||||||
end if;
|
end if;
|
||||||
|
when RXO_LATENCY_BUDGET =>
|
||||||
|
-- Input FIFO Guard
|
||||||
|
if (empty = '0') then
|
||||||
|
rd_guard := '1';
|
||||||
|
cnt_next <= cnt + 1;
|
||||||
|
|
||||||
|
case (cnt) is
|
||||||
|
when 0 =>
|
||||||
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
|
-- COMPATIBLE (DDS v1.4): offered <= requested
|
||||||
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
|
if (not check_qos_compatibility(is_subscriber, '0', unsigned(data_in_swapped), ENDPOINT_LATENCY_BUDGET_QOS(i)(0))) then
|
||||||
|
endpoint_mask_next(i) <= '0';
|
||||||
|
end if;
|
||||||
|
end loop;
|
||||||
|
when 1 =>
|
||||||
|
-- Check QoS Compatibility (Unmark match on incompatibility)
|
||||||
|
-- COMPATIBLE (DDS v1.4): offered <= requested
|
||||||
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
|
if (not check_qos_compatibility(is_subscriber, '0', unsigned(data_in_swapped), ENDPOINT_LATENCY_BUDGET_QOS(i)(1))) then
|
||||||
|
endpoint_mask_next(i) <= '0';
|
||||||
|
end if;
|
||||||
|
end loop;
|
||||||
|
-- DONE
|
||||||
|
stage_next <= SKIP_PARAMETER;
|
||||||
|
when others =>
|
||||||
|
null;
|
||||||
|
end case;
|
||||||
|
end if;
|
||||||
|
when CHECK_MAX_SIZE_SERIALIZED =>
|
||||||
|
-- Input FIFO Guard
|
||||||
|
if (empty = '0') then
|
||||||
|
rd_guard := '1';
|
||||||
|
|
||||||
|
-- Ignore Publishers that may need Fragmentation
|
||||||
|
if (is_subscriber = '0' and unsigned(data_in_swapped) > to_unsigned(UDP_MAX_SIZE_SERIALIZED, CDR_LONG_WIDTH)) then
|
||||||
|
endpoint_mask_next <= (others => '0');
|
||||||
|
end if;
|
||||||
|
-- DONE
|
||||||
|
stage_next <= SKIP_PARAMETER;
|
||||||
|
end if;
|
||||||
when PARTICIPANT_MATCH_STAGE =>
|
when PARTICIPANT_MATCH_STAGE =>
|
||||||
-- Wait for Participant Search to finish and Next Sequence Number to be set
|
-- Wait for Participant Search to finish and Next Sequence Number to be set
|
||||||
if (mem_op_done = '1' and seq_prc_done = '1') then
|
if (mem_op_done = '1' and seq_prc_done = '1') then
|
||||||
@ -2402,18 +2475,24 @@ begin
|
|||||||
-- Propagate Matches to local Endpoints
|
-- Propagate Matches to local Endpoints
|
||||||
stage_next <= INFORM_ENDPOINTS_MATCH;
|
stage_next <= INFORM_ENDPOINTS_MATCH;
|
||||||
cnt_next <= 0;
|
cnt_next <= 0;
|
||||||
|
-- No local Endpoint matches
|
||||||
|
else
|
||||||
|
-- Ignore
|
||||||
|
stage_next <= SKIP_PACKET;
|
||||||
end if;
|
end if;
|
||||||
-- Match in buffer (Existing Endpoint)
|
-- Match in buffer (Existing Endpoint)
|
||||||
else
|
else
|
||||||
-- At least one local Endpoint match
|
-- At least one local Endpoint match
|
||||||
if (endpoint_mask /= (endpoint_mask'range => '0')) then
|
if (endpoint_mask /= (endpoint_mask'range => '0')) then
|
||||||
-- Mark Endpoint match changes
|
-- Mark Endpoint match changes
|
||||||
tmp_endpoint_mask := convert_from_bitmask_array(endpoint_mask_array, NUM_ENDPOINTS);
|
tmp_endpoint_mask := convert_from_bitmask_array(endpoint_mask_array, NUM_ENDPOINTS) xor endpoint_mask;
|
||||||
tmp_endpoint_mask := tmp_endpoint_mask xor endpoint_mask;
|
|
||||||
-- Mark UNMATCHES
|
-- Mark UNMATCHES
|
||||||
endpoint_unmatch_next <= tmp_endpoint_mask xor endpoint_mask;
|
endpoint_unmatch_next <= tmp_endpoint_mask and convert_from_bitmask_array(endpoint_mask_array, NUM_ENDPOINTS);
|
||||||
-- Mark NEW MATCHES
|
-- Mark NEW MATCHES
|
||||||
endpoint_match_next <= tmp_endpoint_mask and endpoint_mask;
|
-- NOTE: Mark all matches and resent the Endpoint Match Frame also to already Matched Endpoints,
|
||||||
|
-- in order to propagate possible data updates (e.g. new Locator)
|
||||||
|
--endpoint_match_next <= tmp_endpoint_mask and endpoint_mask;
|
||||||
|
endpoint_match_next <= endpoint_mask;
|
||||||
-- Update endpoint in buffer
|
-- Update endpoint in buffer
|
||||||
mem_opcode <= UPDATE_ENDPOINT;
|
mem_opcode <= UPDATE_ENDPOINT;
|
||||||
mem_op_start <= '1';
|
mem_op_start <= '1';
|
||||||
@ -2467,7 +2546,8 @@ begin
|
|||||||
-- UDPv4 Port and ExpectsInlineQoSFlag
|
-- UDPv4 Port and ExpectsInlineQoSFlag
|
||||||
when 6 =>
|
when 6 =>
|
||||||
-- Default
|
-- Default
|
||||||
data_out <= (others => '0');
|
data_out <= (others => '0');
|
||||||
|
last_word_out <= '1';
|
||||||
|
|
||||||
-- If Endpoint did not set Port, use Participant Default
|
-- If Endpoint did not set Port, use Participant Default
|
||||||
if (def_port /= (def_port'reverse_range => '0')) then
|
if (def_port /= (def_port'reverse_range => '0')) then
|
||||||
@ -2518,8 +2598,8 @@ begin
|
|||||||
data_out <= guid(2);
|
data_out <= guid(2);
|
||||||
-- Entity ID
|
-- Entity ID
|
||||||
when 4 =>
|
when 4 =>
|
||||||
data_out <= guid(3);
|
data_out <= guid(3);
|
||||||
|
last_word_out <= '1';
|
||||||
-- If we are in the middle of an Orphan Purge Process, return to the search stage
|
-- If we are in the middle of an Orphan Purge Process, return to the search stage
|
||||||
if (is_orphan_search = '1') then
|
if (is_orphan_search = '1') then
|
||||||
stage_next <= FIND_ORPHAN_ENDPOINT;
|
stage_next <= FIND_ORPHAN_ENDPOINT;
|
||||||
@ -3089,7 +3169,7 @@ begin
|
|||||||
max_participant_addr_next <= max_participant_addr;
|
max_participant_addr_next <= max_participant_addr;
|
||||||
max_endpoint_addr_next <= max_endpoint_addr;
|
max_endpoint_addr_next <= max_endpoint_addr;
|
||||||
reset_max_pointer_next <= reset_max_pointer;
|
reset_max_pointer_next <= reset_max_pointer;
|
||||||
mem_guidprefix_next <= mem_guidprefix;
|
mem_guid_next <= mem_guid;
|
||||||
-- DEFAULT Unregistered
|
-- DEFAULT Unregistered
|
||||||
mem_write_data <= (others => '0');
|
mem_write_data <= (others => '0');
|
||||||
mem_op_done <= '0';
|
mem_op_done <= '0';
|
||||||
@ -3196,7 +3276,7 @@ begin
|
|||||||
case (mem_cnt) is
|
case (mem_cnt) is
|
||||||
when 0 =>
|
when 0 =>
|
||||||
-- Preload
|
-- Preload
|
||||||
-- Reached MAX Addr, No Match Found
|
-- Reached End of Participant Memory Area, No Match Found
|
||||||
if (mem_addr_base = max_participant_addr) then
|
if (mem_addr_base = max_participant_addr) then
|
||||||
addr_res_next <= MAX_ADDRESS; --No match
|
addr_res_next <= MAX_ADDRESS; --No match
|
||||||
-- DONE
|
-- DONE
|
||||||
@ -3247,8 +3327,8 @@ begin
|
|||||||
case (mem_cnt) is
|
case (mem_cnt) is
|
||||||
-- Preload
|
-- Preload
|
||||||
when 0 =>
|
when 0 =>
|
||||||
-- Reached MAX Addr, No Match Found
|
-- Reache End of Endpoint Memory Area, No Match Found
|
||||||
if (mem_addr_base = max_endpoint_addr) then
|
if (mem_addr_base < max_endpoint_addr) then
|
||||||
addr_res_next <= MAX_ADDRESS; -- No match
|
addr_res_next <= MAX_ADDRESS; -- No match
|
||||||
-- DONE
|
-- DONE
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
@ -3257,12 +3337,15 @@ begin
|
|||||||
-- Entity ID
|
-- Entity ID
|
||||||
when 1 =>
|
when 1 =>
|
||||||
-- No Match
|
-- No Match
|
||||||
-- Ignore Entity ID if Orphan Search
|
-- Ignore Entity ID Match if Orphan Search (But make sure to ignore empty Slots)
|
||||||
if (is_orphan_search = '0' and mem_read_data /= guid(3)) then
|
if ((is_orphan_search = '0' and mem_read_data /= guid(3)) or mem_read_data = ENTITYID_UNKNOWN) then
|
||||||
-- Continue Search
|
-- Continue Search
|
||||||
mem_addr_next <= tmp;
|
mem_addr_next <= tmp;
|
||||||
mem_addr_base_next <= tmp;
|
mem_addr_base_next <= tmp;
|
||||||
mem_cnt_next <= 0;
|
mem_cnt_next <= 0;
|
||||||
|
-- Latch Entity ID if Orphan Search
|
||||||
|
elsif (is_orphan_search = '1') then
|
||||||
|
mem_guid_next(3) <= mem_read_data;
|
||||||
end if;
|
end if;
|
||||||
-- GUID Prefix 1/3
|
-- GUID Prefix 1/3
|
||||||
when 2 =>
|
when 2 =>
|
||||||
@ -3676,15 +3759,15 @@ begin
|
|||||||
-- GUID Prefix 1/3
|
-- GUID Prefix 1/3
|
||||||
when 1 =>
|
when 1 =>
|
||||||
mem_rd <= '1';
|
mem_rd <= '1';
|
||||||
mem_guidprefix_next(0) <= mem_read_data;
|
mem_guid_next(0) <= mem_read_data;
|
||||||
-- GUID Prefix 2/3
|
-- GUID Prefix 2/3
|
||||||
when 2 =>
|
when 2 =>
|
||||||
mem_rd <= '1';
|
mem_rd <= '1';
|
||||||
mem_guidprefix_next(1) <= mem_read_data;
|
mem_guid_next(1) <= mem_read_data;
|
||||||
-- GUID Prefix 3/3
|
-- GUID Prefix 3/3
|
||||||
when 3 =>
|
when 3 =>
|
||||||
mem_rd <= '1';
|
mem_rd <= '1';
|
||||||
mem_guidprefix_next(2) <= mem_read_data;
|
mem_guid_next(2) <= mem_read_data;
|
||||||
mem_addr_next <= addr_res;
|
mem_addr_next <= addr_res;
|
||||||
-- GUID Prefix 1/3
|
-- GUID Prefix 1/3
|
||||||
when 4 =>
|
when 4 =>
|
||||||
@ -3744,6 +3827,7 @@ begin
|
|||||||
-- MEMORY COLLISION
|
-- MEMORY COLLISION
|
||||||
-- XXX: Posible worst case path (addition and comparison on same clock)
|
-- XXX: Posible worst case path (addition and comparison on same clock)
|
||||||
elsif (tmp > max_endpoint_addr) then
|
elsif (tmp > max_endpoint_addr) then
|
||||||
|
report "Memory Full, Ignoring Participant Data" severity NOTE;
|
||||||
-- Ignore Insertion
|
-- Ignore Insertion
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
else
|
else
|
||||||
@ -3821,8 +3905,8 @@ begin
|
|||||||
-- Preload
|
-- Preload
|
||||||
when 0 =>
|
when 0 =>
|
||||||
-- Exceeded MAX Addr
|
-- Exceeded MAX Addr
|
||||||
if (mem_addr_base > max_endpoint_addr) then
|
if (mem_addr_base < max_endpoint_addr) then
|
||||||
-- We are in the middle of resetting the MAX Participant Pointer
|
-- If we are in the middle of resetting the MAX Participant Pointer
|
||||||
if (reset_max_pointer = '1') then
|
if (reset_max_pointer = '1') then
|
||||||
-- Reset MAX Endpoint Pointer to last occupied slot
|
-- Reset MAX Endpoint Pointer to last occupied slot
|
||||||
if (last_addr /= MAX_ADDRESS) then
|
if (last_addr /= MAX_ADDRESS) then
|
||||||
@ -3832,6 +3916,7 @@ begin
|
|||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
-- MEMORY COLLISION
|
-- MEMORY COLLISION
|
||||||
elsif (mem_addr_base < max_participant_addr) then
|
elsif (mem_addr_base < max_participant_addr) then
|
||||||
|
report "Memory Full, Ignoring Endpoint Data" severity NOTE;
|
||||||
-- Ignore Insertion
|
-- Ignore Insertion
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
else
|
else
|
||||||
@ -3953,7 +4038,7 @@ begin
|
|||||||
when 1 =>
|
when 1 =>
|
||||||
-- Slot Occupied
|
-- Slot Occupied
|
||||||
if (mem_read_data /= GUIDPREFIX_UNKNOWN(0)) then
|
if (mem_read_data /= GUIDPREFIX_UNKNOWN(0)) then
|
||||||
-- Jumpt to Stale Check
|
-- Jump to Stale Check
|
||||||
mem_addr_next <= tmp2;
|
mem_addr_next <= tmp2;
|
||||||
mem_cnt_next <= 4;
|
mem_cnt_next <= 4;
|
||||||
end if;
|
end if;
|
||||||
@ -3961,7 +4046,7 @@ begin
|
|||||||
when 2 =>
|
when 2 =>
|
||||||
-- Slot Occupied
|
-- Slot Occupied
|
||||||
if (mem_read_data /= GUIDPREFIX_UNKNOWN(1)) then
|
if (mem_read_data /= GUIDPREFIX_UNKNOWN(1)) then
|
||||||
-- Jumpt to Stale Check
|
-- Jump to Stale Check
|
||||||
mem_addr_next <= tmp2;
|
mem_addr_next <= tmp2;
|
||||||
mem_cnt_next <= 4;
|
mem_cnt_next <= 4;
|
||||||
end if;
|
end if;
|
||||||
@ -3969,7 +4054,7 @@ begin
|
|||||||
when 3 =>
|
when 3 =>
|
||||||
-- Slot Occupied
|
-- Slot Occupied
|
||||||
if (mem_read_data /= GUIDPREFIX_UNKNOWN(2)) then
|
if (mem_read_data /= GUIDPREFIX_UNKNOWN(2)) then
|
||||||
-- Jumpt to Stale Check
|
-- Jump to Stale Check
|
||||||
mem_addr_next <= tmp2;
|
mem_addr_next <= tmp2;
|
||||||
mem_cnt_next <= 4;
|
mem_cnt_next <= 4;
|
||||||
-- Slot Empty
|
-- Slot Empty
|
||||||
@ -4115,10 +4200,11 @@ begin
|
|||||||
addr_res <= (others => '0');
|
addr_res <= (others => '0');
|
||||||
last_addr <= (others => '0');
|
last_addr <= (others => '0');
|
||||||
long_latch <= (others => '0');
|
long_latch <= (others => '0');
|
||||||
|
rcvd <= (others => '0');
|
||||||
max_participant_addr <= FIRST_PARTICIPANT_ADDRESS;
|
max_participant_addr <= FIRST_PARTICIPANT_ADDRESS;
|
||||||
max_endpoint_addr <= FIRST_ENDPOINT_ADDRESS;
|
max_endpoint_addr <= FIRST_ENDPOINT_ADDRESS;
|
||||||
guid <= (others => (others => '0'));
|
guid <= (others => (others => '0'));
|
||||||
mem_guidprefix <= (others => (others => '0'));
|
mem_guid <= (others => (others => '0'));
|
||||||
endpoint_mask_array <= (others => (others => '0'));
|
endpoint_mask_array <= (others => (others => '0'));
|
||||||
lease_duration <= (others => (others => '0'));
|
lease_duration <= (others => (others => '0'));
|
||||||
deadline <= (others => (others => '0'));
|
deadline <= (others => (others => '0'));
|
||||||
@ -4150,7 +4236,6 @@ begin
|
|||||||
is_heartbeat_res <= '0';
|
is_heartbeat_res <= '0';
|
||||||
reset_max_pointer <= '0';
|
reset_max_pointer <= '0';
|
||||||
last_word_in_latch <= '0';
|
last_word_in_latch <= '0';
|
||||||
domain_tag_rcv <= '0';
|
|
||||||
else
|
else
|
||||||
stage <= stage_next;
|
stage <= stage_next;
|
||||||
return_stage <= return_stage_next;
|
return_stage <= return_stage_next;
|
||||||
@ -4181,10 +4266,11 @@ begin
|
|||||||
addr_res <= addr_res_next;
|
addr_res <= addr_res_next;
|
||||||
last_addr <= last_addr_next;
|
last_addr <= last_addr_next;
|
||||||
long_latch <= long_latch_next;
|
long_latch <= long_latch_next;
|
||||||
|
rcvd <= rcvd_next;
|
||||||
max_participant_addr <= max_participant_addr_next;
|
max_participant_addr <= max_participant_addr_next;
|
||||||
max_endpoint_addr <= max_endpoint_addr_next;
|
max_endpoint_addr <= max_endpoint_addr_next;
|
||||||
guid <= guid_next;
|
guid <= guid_next;
|
||||||
mem_guidprefix <= mem_guidprefix_next;
|
mem_guid <= mem_guid_next;
|
||||||
endpoint_mask_array <= endpoint_mask_array_next;
|
endpoint_mask_array <= endpoint_mask_array_next;
|
||||||
lease_duration <= lease_duration_next;
|
lease_duration <= lease_duration_next;
|
||||||
deadline <= deadline_next;
|
deadline <= deadline_next;
|
||||||
@ -4216,7 +4302,6 @@ begin
|
|||||||
is_heartbeat_res <= is_heartbeat_res_next;
|
is_heartbeat_res <= is_heartbeat_res_next;
|
||||||
reset_max_pointer <= reset_max_pointer_next;
|
reset_max_pointer <= reset_max_pointer_next;
|
||||||
last_word_in_latch <= last_word_in_latch_next;
|
last_word_in_latch <= last_word_in_latch_next;
|
||||||
domain_tag_rcv <= domain_tag_rcv_next;
|
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
end process;
|
end process;
|
||||||
|
|||||||
@ -76,6 +76,18 @@ package rtps_config_package is
|
|||||||
-- TODO: Use everywhere
|
-- TODO: Use everywhere
|
||||||
constant EMPTY_STRING : STRING_WORD_ARRAY_TYPE := (others => (others => '0'));
|
constant EMPTY_STRING : STRING_WORD_ARRAY_TYPE := (others => (others => '0'));
|
||||||
|
|
||||||
|
type DEFAULT_QOS_MATCH_TYPE is record
|
||||||
|
DURABILITY_QOS : std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||||
|
PRESENTATION_QOS : std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||||
|
DEADLINE_QOS : std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||||
|
LATENCY_BUDGET_QOS : std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||||
|
OWNERSHIP_QOS : std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||||
|
LIVELINESS_QOS : std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||||
|
RELIABILITY_QOS : std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||||
|
DESTINATION_ORDER_QOS : std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||||
|
end record;
|
||||||
|
constant READER_DEFAULT_QOS_MATCH : DEFAULT_QOS_MATCH_TYPE; -- Deferred to Package Body
|
||||||
|
constant WRITER_DEFAULT_QOS_MATCH : DEFAULT_QOS_MATCH_TYPE; -- Deferred to Package Body
|
||||||
|
|
||||||
-- Swap "data" to Big Endian representation.
|
-- Swap "data" to Big Endian representation.
|
||||||
function endian_swap(swap : std_logic; data : std_logic_vector) return std_logic_vector;
|
function endian_swap(swap : std_logic; data : std_logic_vector) return std_logic_vector;
|
||||||
@ -87,6 +99,8 @@ package rtps_config_package is
|
|||||||
function convert_string (str : USER_STRING_TYPE) return STRING_WORD_ARRAY_TYPE;
|
function convert_string (str : USER_STRING_TYPE) return STRING_WORD_ARRAY_TYPE;
|
||||||
|
|
||||||
function round_slv(slv : std_logic_vector; width : natural) return std_logic_vector;
|
function round_slv(slv : std_logic_vector; width : natural) return std_logic_vector;
|
||||||
|
|
||||||
|
function check_qos_compatibility(src_is_reader : std_logic; direction : std_logic; remote : unsigned(WORD_WIDTH-1 downto 0); local : unsigned(WORD_WIDTH-1 downto 0)) return boolean;
|
||||||
end package;
|
end package;
|
||||||
|
|
||||||
package body rtps_config_package is
|
package body rtps_config_package is
|
||||||
@ -748,6 +762,102 @@ package body rtps_config_package is
|
|||||||
|
|
||||||
constant PARTICIPANT_DATA : OUTPUT_DATA_TYPE := gen_participant_data;
|
constant PARTICIPANT_DATA : OUTPUT_DATA_TYPE := gen_participant_data;
|
||||||
|
|
||||||
|
-- Direction 1 : Offered >= Requested
|
||||||
|
-- Direction 0 : Offered <= Requested
|
||||||
|
-- src_is_reader 1 : Remote is Subscriber-Requested
|
||||||
|
-- src_is_reader 0 : Remote is Publisher-Offered
|
||||||
|
function check_qos_compatibility(src_is_reader : std_logic; direction : std_logic; remote : unsigned(WORD_WIDTH-1 downto 0); local : unsigned(WORD_WIDTH-1 downto 0)) return boolean is
|
||||||
|
variable ret : boolean;
|
||||||
|
begin
|
||||||
|
-- Default Match
|
||||||
|
ret := TRUE;
|
||||||
|
|
||||||
|
if ((src_is_reader xor direction) = '1') then
|
||||||
|
if (remote < local) then
|
||||||
|
ret := FALSE;
|
||||||
|
end if;
|
||||||
|
else
|
||||||
|
if (remote > local) then
|
||||||
|
ret := FALSE;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
end function;
|
||||||
|
|
||||||
|
function gen_default_qos_match(is_reader : boolean) return DEFAULT_QOS_MATCH_TYPE is
|
||||||
|
variable ret : DEFAULT_QOS_MATCH_TYPE;
|
||||||
|
begin
|
||||||
|
-- Default Match
|
||||||
|
ret := (others => (others => '1'));
|
||||||
|
|
||||||
|
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||||
|
-- DURABILITY
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '1', unsigned(DEFAULT_DURABILITY_QOS), unsigned(ENDPOINT_DURABILITY_QOS(i)))) then
|
||||||
|
ret.DURABILITY_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
-- PRESENTATION
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '1', unsigned(DEFAULT_PRESENTATION_QOS), unsigned(ENDPOINT_PRESENTATION_QOS(i)))) then
|
||||||
|
ret.PRESENTATION_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
if (is_reader) then
|
||||||
|
if (DEFAULT_COHERENT_ACCESS and not ENDPOINT_COHERENT_ACCESS(i)) then
|
||||||
|
ret.PRESENTATION_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
if (DEFAULT_ORDERED_ACCESS and not ENDPOINT_ORDERED_ACCESS(i)) then
|
||||||
|
ret.PRESENTATION_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
else
|
||||||
|
if (not DEFAULT_COHERENT_ACCESS and ENDPOINT_COHERENT_ACCESS(i)) then
|
||||||
|
ret.PRESENTATION_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
if (not DEFAULT_ORDERED_ACCESS and ENDPOINT_ORDERED_ACCESS(i)) then
|
||||||
|
ret.PRESENTATION_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
-- DEADLINE
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '0', DEFAULT_DEADLINE_QOS(0), ENDPOINT_DEADLINE_QOS(i)(0))) then
|
||||||
|
ret.DEADLINE_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '0', DEFAULT_DEADLINE_QOS(1), ENDPOINT_DEADLINE_QOS(i)(1))) then
|
||||||
|
ret.DEADLINE_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
-- LATENCY_BUDGET
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '0', DEFAULT_LATENCY_BUDGET_QOS(0), ENDPOINT_LATENCY_BUDGET_QOS(i)(0))) then
|
||||||
|
ret.LATENCY_BUDGET_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '0', DEFAULT_LATENCY_BUDGET_QOS(1), ENDPOINT_LATENCY_BUDGET_QOS(i)(1))) then
|
||||||
|
ret.LATENCY_BUDGET_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
-- OWNERSHIP
|
||||||
|
if (DEFAULT_OWNERSHIP_QOS /= ENDPOINT_OWNERSHIP_QOS(i)) then
|
||||||
|
ret.OWNERSHIP_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
-- LIVELINESS
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '1', unsigned(DEFAULT_LIVELINESS_QOS), unsigned(ENDPOINT_LIVELINESS_QOS(i)))) then
|
||||||
|
ret.LIVELINESS_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '0', DEFAULT_LEASE_DURATION(0), ENDPOINT_LEASE_DURATION(i)(0))) then
|
||||||
|
ret.LIVELINESS_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '0', DEFAULT_LEASE_DURATION(1), ENDPOINT_LEASE_DURATION(i)(1))) then
|
||||||
|
ret.LIVELINESS_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
-- RELIABILITY
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '1', unsigned(DEFAULT_RELIABILTY_QOS), unsigned(ENDPOINT_RELIABILITY_QOS(i)))) then
|
||||||
|
ret.RELIABILITY_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
-- DESTINATION_ORDER
|
||||||
|
if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '1', unsigned(DEFAULT_DESTINATION_ORDER_QOS), unsigned(ENDPOINT_DESTINATION_ORDER_QOS(i)))) then
|
||||||
|
ret.DESTINATION_ORDER_QOS(i) := '0';
|
||||||
|
end if;
|
||||||
|
end loop;
|
||||||
|
return ret;
|
||||||
|
end function;
|
||||||
|
|
||||||
|
constant READER_DEFAULT_QOS_MATCH : DEFAULT_QOS_MATCH_TYPE := gen_default_qos_match(TRUE);
|
||||||
|
constant WRITER_DEFAULT_QOS_MATCH : DEFAULT_QOS_MATCH_TYPE := gen_default_qos_match(FALSE);
|
||||||
|
|
||||||
-- Returns the 'data' argument either as is, or with reversed Byte order, depending on the
|
-- Returns the 'data' argument either as is, or with reversed Byte order, depending on the
|
||||||
-- 'swap' argument.
|
-- 'swap' argument.
|
||||||
function endian_swap(swap : std_logic; data : std_logic_vector) return std_logic_vector is
|
function endian_swap(swap : std_logic; data : std_logic_vector) return std_logic_vector is
|
||||||
|
|||||||
@ -239,7 +239,7 @@ package rtps_package is
|
|||||||
-- DEADLINE
|
-- DEADLINE
|
||||||
constant DEFAULT_DEADLINE_QOS : DURATION_TYPE := DURATION_INFINITE;
|
constant DEFAULT_DEADLINE_QOS : DURATION_TYPE := DURATION_INFINITE;
|
||||||
-- LATENCY BUDGET
|
-- LATENCY BUDGET
|
||||||
constant DEFAULT_LATENCY_BUDGET_QOS : DURATION_TYPE := (others => (others => '0'));
|
constant DEFAULT_LATENCY_BUDGET_QOS : DURATION_TYPE := DURATION_ZERO;
|
||||||
-- OWNERSHIP
|
-- OWNERSHIP
|
||||||
constant SHARED_OWNERSHIP_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(0,CDR_ENUMERATION_WIDTH));
|
constant SHARED_OWNERSHIP_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(0,CDR_ENUMERATION_WIDTH));
|
||||||
constant EXCLUSIVE_OWNERSHIP_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,CDR_ENUMERATION_WIDTH));
|
constant EXCLUSIVE_OWNERSHIP_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,CDR_ENUMERATION_WIDTH));
|
||||||
@ -254,7 +254,7 @@ package rtps_package is
|
|||||||
-- LEASE DURATION (LIVELINESS)
|
-- LEASE DURATION (LIVELINESS)
|
||||||
constant DEFAULT_LEASE_DURATION : DURATION_TYPE := DURATION_INFINITE;
|
constant DEFAULT_LEASE_DURATION : DURATION_TYPE := DURATION_INFINITE;
|
||||||
-- TIME_BASED_FILTER
|
-- TIME_BASED_FILTER
|
||||||
constant DEFAULT_TIME_BASED_FILTER_QOS : DURATION_TYPE := (others => (others => '0'));
|
constant DEFAULT_TIME_BASED_FILTER_QOS : DURATION_TYPE := DURATION_ZERO;
|
||||||
-- RELIABILITY
|
-- RELIABILITY
|
||||||
constant BEST_EFFORT_RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,CDR_ENUMERATION_WIDTH));
|
constant BEST_EFFORT_RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,CDR_ENUMERATION_WIDTH));
|
||||||
constant RELIABLE_RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(2,CDR_ENUMERATION_WIDTH));
|
constant RELIABLE_RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(2,CDR_ENUMERATION_WIDTH));
|
||||||
@ -288,7 +288,7 @@ package rtps_package is
|
|||||||
constant DISALLOW_TYPE_COERCION : std_logic_vector(CDR_ENUMERATION_SHORT_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(0,CDR_ENUMERATION_SHORT_WIDTH));
|
constant DISALLOW_TYPE_COERCION : std_logic_vector(CDR_ENUMERATION_SHORT_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(0,CDR_ENUMERATION_SHORT_WIDTH));
|
||||||
constant ALLOW_TYPE_COERCION : std_logic_vector(CDR_ENUMERATION_SHORT_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,CDR_ENUMERATION_SHORT_WIDTH));
|
constant ALLOW_TYPE_COERCION : std_logic_vector(CDR_ENUMERATION_SHORT_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,CDR_ENUMERATION_SHORT_WIDTH));
|
||||||
-- DURABILITY SERVICE (DURABILITY)
|
-- DURABILITY SERVICE (DURABILITY)
|
||||||
constant DEFAULT_DURABILITY_SERVICE_CLEANUP_DELAY : DURATION_TYPE := (others => (others => '0'));
|
constant DEFAULT_DURABILITY_SERVICE_CLEANUP_DELAY : DURATION_TYPE := DURATION_ZERO;
|
||||||
constant DEFAULT_DURABILITY_SERVICE_HISTORY : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := KEEP_LAST_HISTORY_QOS;
|
constant DEFAULT_DURABILITY_SERVICE_HISTORY : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := KEEP_LAST_HISTORY_QOS;
|
||||||
constant DEFAULT_DURABILITY_SERVICE_HISTORY_DEPTH : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,CDR_LONG_WIDTH));
|
constant DEFAULT_DURABILITY_SERVICE_HISTORY_DEPTH : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,CDR_LONG_WIDTH));
|
||||||
constant DEFAULT_DURABILITY_SERVICE_MAX_SAMPLES : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := std_logic_vector(to_signed(-1,CDR_LONG_WIDTH)); -- LENGTH_UNLIMITED
|
constant DEFAULT_DURABILITY_SERVICE_MAX_SAMPLES : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := std_logic_vector(to_signed(-1,CDR_LONG_WIDTH)); -- LENGTH_UNLIMITED
|
||||||
@ -372,15 +372,15 @@ package body rtps_package is
|
|||||||
constant half_sec : natural := sec/2;
|
constant half_sec : natural := sec/2;
|
||||||
begin
|
begin
|
||||||
assert (ns < 10**9) report "ns argument has to be less than a second" severity failure;
|
assert (ns < 10**9) report "ns argument has to be less than a second" severity failure;
|
||||||
ret(0) := to_unsigned(s, 32);
|
ret(0) := to_unsigned(s, WORD_WIDTH);
|
||||||
|
|
||||||
-- If Fraction Bit is >= 500 ms it cannot be represented as a natural (because naturals/integers are signed).
|
-- If Fraction Bit is >= 500 ms it cannot be represented as a natural (because naturals/integers are signed).
|
||||||
-- So we handle that manualy
|
-- So we handle that manualy
|
||||||
if (ns >= half_sec) then
|
if (ns >= half_sec) then
|
||||||
ret(1)(31) := '1';
|
ret(1)(31) := '1';
|
||||||
ret(1) := to_unsigned(natural(CEIL(real(ns/2)*unit)),32);
|
ret(1) := to_unsigned(natural(CEIL(real(ns/2)*unit)),WORD_WIDTH);
|
||||||
else
|
else
|
||||||
ret(1) := to_unsigned(natural(CEIL(real(ns)*unit)),32);
|
ret(1) := to_unsigned(natural(CEIL(real(ns)*unit)),WORD_WIDTH);
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@ -211,16 +211,22 @@ package rtps_test_package is
|
|||||||
unicastLocatorList : LOCATOR_LIST_TYPE;
|
unicastLocatorList : LOCATOR_LIST_TYPE;
|
||||||
multicastLocatorList : LOCATOR_LIST_TYPE;
|
multicastLocatorList : LOCATOR_LIST_TYPE;
|
||||||
max_size_serialized : std_logic_vector(CDR_LONG_WIDTH-1 downto 0);
|
max_size_serialized : std_logic_vector(CDR_LONG_WIDTH-1 downto 0);
|
||||||
|
match : MATCH_TYPE;
|
||||||
end record;
|
end record;
|
||||||
|
|
||||||
constant DEFAULT_ENDPOINT_DATA : ENDPOINT_DATA_TYPE; -- Deferred to Package Body
|
constant DEFAULT_ENDPOINT_DATA : ENDPOINT_DATA_TYPE; -- Deferred to Package Body
|
||||||
|
type ENDPOINT_DATA_ARRAY_TYPE is array (natural range <>) of ENDPOINT_DATA_TYPE;
|
||||||
|
|
||||||
procedure gen_endpoint_data( ref : in ENDPOINT_DATA_TYPE; output : inout TEST_PACKET_TYPE);
|
procedure gen_endpoint_data( ref : in ENDPOINT_DATA_TYPE; output : inout TEST_PACKET_TYPE);
|
||||||
|
procedure gen_match_frame( ref : in ENDPOINT_DATA_TYPE; output : inout TEST_PACKET_TYPE);
|
||||||
|
function gen_endpoint_array(readers : boolean) return ENDPOINT_DATA_ARRAY_TYPE;
|
||||||
|
|
||||||
procedure gen_sentinel(output : inout TEST_PACKET_TYPE);
|
procedure gen_sentinel(output : inout TEST_PACKET_TYPE);
|
||||||
|
|
||||||
procedure gen_rand_loc(RV : inout RandomPType; ret : out LOCATOR_TYPE);
|
procedure gen_rand_loc(RV : inout RandomPType; ret : out LOCATOR_TYPE);
|
||||||
|
procedure gen_rand_entityid(RV : inout RandomPType; reader : boolean; ret : out std_logic_vector(ENTITYID_WIDTH-1 downto 0));
|
||||||
function int(n : integer; width : natural) return std_logic_vector;
|
function int(n : integer; width : natural) return std_logic_vector;
|
||||||
|
function to_string1 (input : std_logic_vector) return string;
|
||||||
|
|
||||||
end package;
|
end package;
|
||||||
|
|
||||||
@ -235,6 +241,17 @@ package body rtps_test_package is
|
|||||||
ret.addr(IPv4_ADDRESS_WIDTH-1 downto 0) := RV.RandSlv(IPv4_ADDRESS_WIDTH);
|
ret.addr(IPv4_ADDRESS_WIDTH-1 downto 0) := RV.RandSlv(IPv4_ADDRESS_WIDTH);
|
||||||
end procedure;
|
end procedure;
|
||||||
|
|
||||||
|
procedure gen_rand_entityid(RV : inout RandomPType; reader : boolean; ret : out std_logic_vector(ENTITYID_WIDTH-1 downto 0)) is
|
||||||
|
begin
|
||||||
|
ret := RV.RandSlv(ENTITYID_WIDTH);
|
||||||
|
ret(ENTITY_KIND_H_RANGE):= USER_DEFINED_ENTITY;
|
||||||
|
if (reader) then
|
||||||
|
ret(ENTITY_KIND_L_RANGE):= READER_NO_KEY;
|
||||||
|
else
|
||||||
|
ret(ENTITY_KIND_L_RANGE):= WRITER_NO_KEY;
|
||||||
|
end if;
|
||||||
|
end procedure;
|
||||||
|
|
||||||
function int(n : integer; width : natural) return std_logic_vector is
|
function int(n : integer; width : natural) return std_logic_vector is
|
||||||
begin
|
begin
|
||||||
return std_logic_vector(to_signed(n, width));
|
return std_logic_vector(to_signed(n, width));
|
||||||
@ -416,7 +433,8 @@ package body rtps_test_package is
|
|||||||
expectsInlineQoS => (others => '0'),
|
expectsInlineQoS => (others => '0'),
|
||||||
unicastLocatorList => EMPTY_LOCATOR_LIST,
|
unicastLocatorList => EMPTY_LOCATOR_LIST,
|
||||||
multicastLocatorList => EMPTY_LOCATOR_LIST,
|
multicastLocatorList => EMPTY_LOCATOR_LIST,
|
||||||
max_size_serialized => (others => '0')
|
max_size_serialized => (others => '0'),
|
||||||
|
match => MATCH
|
||||||
);
|
);
|
||||||
|
|
||||||
-- *PACKAGE INTERNAL HELPER FUNCTIONS*
|
-- *PACKAGE INTERNAL HELPER FUNCTIONS*
|
||||||
@ -881,7 +899,6 @@ package body rtps_test_package is
|
|||||||
-- DOMAIN TAG
|
-- DOMAIN TAG
|
||||||
if (ref.domainTag /= DEFAULT_DOMAIN_TAG) then
|
if (ref.domainTag /= DEFAULT_DOMAIN_TAG) then
|
||||||
tmp := string_len(ref.domainTag);
|
tmp := string_len(ref.domainTag);
|
||||||
report "Strlen domain_tag = " & to_string(tmp);
|
|
||||||
output.data(output.length) := PID_DOMAIN_TAG & endian_swap(ref.littleEndian, int((round_div(tmp,4)+1)*4, PARAMETER_LENGTH_WIDTH));
|
output.data(output.length) := PID_DOMAIN_TAG & endian_swap(ref.littleEndian, int((round_div(tmp,4)+1)*4, PARAMETER_LENGTH_WIDTH));
|
||||||
output.length := output.length + 1;
|
output.length := output.length + 1;
|
||||||
output.data(output.length) := endian_swap(ref.littleEndian, int(tmp, CDR_LONG_WIDTH));
|
output.data(output.length) := endian_swap(ref.littleEndian, int(tmp, CDR_LONG_WIDTH));
|
||||||
@ -1124,6 +1141,13 @@ package body rtps_test_package is
|
|||||||
procedure gen_endpoint_data( ref : in ENDPOINT_DATA_TYPE; output : inout TEST_PACKET_TYPE) is
|
procedure gen_endpoint_data( ref : in ENDPOINT_DATA_TYPE; output : inout TEST_PACKET_TYPE) is
|
||||||
variable tmp : natural := 0;
|
variable tmp : natural := 0;
|
||||||
begin
|
begin
|
||||||
|
-- Representation Identifier & Representation Options
|
||||||
|
if (ref.littleEndian = '0') then
|
||||||
|
output.data(output.length) := PL_CDR_BE & x"0000";
|
||||||
|
else
|
||||||
|
output.data(output.length) := PL_CDR_LE & x"0000";
|
||||||
|
end if;
|
||||||
|
output.length := output.length + 1;
|
||||||
-- GUID
|
-- GUID
|
||||||
output.data(output.length) := PID_ENDPOINT_GUID & endian_swap(ref.littleEndian, int(16,PARAMETER_LENGTH_WIDTH));
|
output.data(output.length) := PID_ENDPOINT_GUID & endian_swap(ref.littleEndian, int(16,PARAMETER_LENGTH_WIDTH));
|
||||||
output.length := output.length + 1;
|
output.length := output.length + 1;
|
||||||
@ -1155,7 +1179,7 @@ package body rtps_test_package is
|
|||||||
end loop;
|
end loop;
|
||||||
-- TYPE NAME
|
-- TYPE NAME
|
||||||
tmp := string_len(ref.type_name);
|
tmp := string_len(ref.type_name);
|
||||||
output.data(output.length) := PID_TOPIC_NAME & endian_swap(ref.littleEndian, int((round_div(tmp,4)+1)*4,PARAMETER_LENGTH_WIDTH));
|
output.data(output.length) := PID_TYPE_NAME & endian_swap(ref.littleEndian, int((round_div(tmp,4)+1)*4,PARAMETER_LENGTH_WIDTH));
|
||||||
output.length := output.length + 1;
|
output.length := output.length + 1;
|
||||||
output.data(output.length) := endian_swap(ref.littleEndian, int(tmp,CDR_LONG_WIDTH));
|
output.data(output.length) := endian_swap(ref.littleEndian, int(tmp,CDR_LONG_WIDTH));
|
||||||
output.length := output.length + 1;
|
output.length := output.length + 1;
|
||||||
@ -1198,7 +1222,7 @@ package body rtps_test_package is
|
|||||||
output.length := output.length + 1;
|
output.length := output.length + 1;
|
||||||
output.data(output.length) := endian_swap(ref.littleEndian, ref.presentation);
|
output.data(output.length) := endian_swap(ref.littleEndian, ref.presentation);
|
||||||
output.length := output.length + 1;
|
output.length := output.length + 1;
|
||||||
output.data(output.length) := endian_swap(ref.littleEndian, ref.coherent_access) & endian_swap(ref.littleEndian, ref.ordered_access);
|
output.data(output.length) := endian_swap(ref.littleEndian, ref.coherent_access) & endian_swap(ref.littleEndian, ref.ordered_access) & (0 to 15 => '0');
|
||||||
output.length := output.length + 1;
|
output.length := output.length + 1;
|
||||||
end if;
|
end if;
|
||||||
-- DEADLINE
|
-- DEADLINE
|
||||||
@ -1214,9 +1238,9 @@ package body rtps_test_package is
|
|||||||
if (ref.latency_budget /= DEFAULT_LATENCY_BUDGET_QOS) then
|
if (ref.latency_budget /= DEFAULT_LATENCY_BUDGET_QOS) then
|
||||||
output.data(output.length) := PID_LATENCY_BUDGET & endian_swap(ref.littleEndian, int(8,PARAMETER_LENGTH_WIDTH));
|
output.data(output.length) := PID_LATENCY_BUDGET & endian_swap(ref.littleEndian, int(8,PARAMETER_LENGTH_WIDTH));
|
||||||
output.length := output.length + 1;
|
output.length := output.length + 1;
|
||||||
output.data(output.length) := endian_swap(ref.littleEndian, std_logic_vector(ref.deadline(0)));
|
output.data(output.length) := endian_swap(ref.littleEndian, std_logic_vector(ref.latency_budget(0)));
|
||||||
output.length := output.length + 1;
|
output.length := output.length + 1;
|
||||||
output.data(output.length) := endian_swap(ref.littleEndian, std_logic_vector(ref.deadline(1)));
|
output.data(output.length) := endian_swap(ref.littleEndian, std_logic_vector(ref.latency_budget(1)));
|
||||||
output.length := output.length + 1;
|
output.length := output.length + 1;
|
||||||
end if;
|
end if;
|
||||||
-- OWNERSHIP
|
-- OWNERSHIP
|
||||||
@ -1372,6 +1396,59 @@ package body rtps_test_package is
|
|||||||
end if;
|
end if;
|
||||||
end procedure;
|
end procedure;
|
||||||
|
|
||||||
|
procedure gen_match_frame( ref : in ENDPOINT_DATA_TYPE; output : inout TEST_PACKET_TYPE) is
|
||||||
|
variable loc : LOCATOR_TYPE;
|
||||||
|
begin
|
||||||
|
-- Fetch relevant Locator
|
||||||
|
if (is_valid_loc(get_loc(ref.unicastLocatorList))) then
|
||||||
|
loc := get_loc(ref.unicastLocatorList);
|
||||||
|
elsif (is_valid_loc(get_loc(ref.multicastLocatorList))) then
|
||||||
|
loc := get_loc(ref.multicastLocatorList);
|
||||||
|
elsif (is_valid_loc(get_loc(ref.participant.defaultUnicastLocatorList))) then
|
||||||
|
loc := get_loc(ref.participant.defaultUnicastLocatorList);
|
||||||
|
elsif (is_valid_loc(get_loc(ref.participant.defaultMulticastLocatorList))) then
|
||||||
|
loc := get_loc(ref.participant.defaultMulticastLocatorList);
|
||||||
|
else
|
||||||
|
assert(FALSE) report "Endpoint has no valid Locators" severity FAILURE;
|
||||||
|
loc := EMPTY_LOCATOR;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- OPCODE
|
||||||
|
case (ref.match) is
|
||||||
|
when MATCH =>
|
||||||
|
output.data(output.length) := OPCODE_MATCH;
|
||||||
|
output.length := output.length + 1;
|
||||||
|
when UNMATCH =>
|
||||||
|
output.data(output.length) := OPCODE_UNMATCH;
|
||||||
|
output.length := output.length + 1;
|
||||||
|
when others =>
|
||||||
|
null;
|
||||||
|
end case;
|
||||||
|
-- GUID Prefix
|
||||||
|
output.data(output.length) := ref.participant.guidPrefix(0);
|
||||||
|
output.length := output.length + 1;
|
||||||
|
output.data(output.length) := ref.participant.guidPrefix(1);
|
||||||
|
output.length := output.length + 1;
|
||||||
|
output.data(output.length) := ref.participant.guidPrefix(2);
|
||||||
|
output.length := output.length + 1;
|
||||||
|
-- ENTITY ID
|
||||||
|
output.data(output.length) := ref.entityId;
|
||||||
|
output.length := output.length + 1;
|
||||||
|
if (ref.match = MATCH) then
|
||||||
|
-- IPv4 Address
|
||||||
|
output.data(output.length) := loc.addr(IPv4_ADDRESS_WIDTH-1 downto 0);
|
||||||
|
output.length := output.length + 1;
|
||||||
|
-- Port & expectsInlineQoS
|
||||||
|
output.data(output.length) := (others => '0');
|
||||||
|
output.data(output.length)(WORD_WIDTH-1 downto UDP_PORT_WIDTH) := loc.portn(UDP_PORT_WIDTH-1 downto 0);
|
||||||
|
output.data(output.length)(0) := ref.expectsInlineQoS(0);
|
||||||
|
output.length := output.length + 1;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- Mark Last Word
|
||||||
|
output.last(output.length-1) := '1';
|
||||||
|
end procedure;
|
||||||
|
|
||||||
procedure gen_sentinel(output : inout TEST_PACKET_TYPE) is
|
procedure gen_sentinel(output : inout TEST_PACKET_TYPE) is
|
||||||
begin
|
begin
|
||||||
output.data(output.length) := PID_SENTINEL & (PARAMETER_LENGTH_WIDTH-1 downto 0 => '0');
|
output.data(output.length) := PID_SENTINEL & (PARAMETER_LENGTH_WIDTH-1 downto 0 => '0');
|
||||||
@ -1392,9 +1469,77 @@ package body rtps_test_package is
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
end function;
|
end function;
|
||||||
|
|
||||||
|
function gen_endpoint_array(readers : boolean) return ENDPOINT_DATA_ARRAY_TYPE is
|
||||||
|
variable ret_readers : ENDPOINT_DATA_ARRAY_TYPE(0 to NUM_READERS-1) := (others => DEFAULT_ENDPOINT_DATA);
|
||||||
|
variable ret_writers : ENDPOINT_DATA_ARRAY_TYPE(0 to NUM_WRITERS-1) := (others => DEFAULT_ENDPOINT_DATA);
|
||||||
|
begin
|
||||||
|
if (readers) then
|
||||||
|
for i in 0 to NUM_READERS-1 loop
|
||||||
|
ret_readers(i).topic_name := ENDPOINT_TOPIC(i);
|
||||||
|
ret_readers(i).type_name := ENDPOINT_TYPE(i);
|
||||||
|
ret_readers(i).durability := ENDPOINT_DURABILITY_QOS(i);
|
||||||
|
ret_readers(i).durability_service_cleanup_delay := ENDPOINT_DURABILITY_SERVICE_CLEANUP_DELAY(i);
|
||||||
|
ret_readers(i).durability_service_history := ENDPOINT_DURABILITY_SERVICE_HISTORY(i);
|
||||||
|
ret_readers(i).durability_service_history_depth := ENDPOINT_DURABILITY_SERVICE_HISTORY_DEPTH(i);
|
||||||
|
ret_readers(i).durability_service_max_samples := ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES(i);
|
||||||
|
ret_readers(i).durability_service_max_instances := ENDPOINT_DURABILITY_SERVICE_MAX_INSTANCES(i);
|
||||||
|
ret_readers(i).durability_service_max_samples_per_instances := ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE(i);
|
||||||
|
ret_readers(i).presentation := ENDPOINT_PRESENTATION_QOS(i);
|
||||||
|
ret_readers(i).coherent_access(0) := boolean_to_std_logic(ENDPOINT_COHERENT_ACCESS(i));
|
||||||
|
ret_readers(i).ordered_access(0) := boolean_to_std_logic(ENDPOINT_ORDERED_ACCESS(i));
|
||||||
|
ret_readers(i).deadline := ENDPOINT_DEADLINE_QOS(i);
|
||||||
|
ret_readers(i).latency_budget := ENDPOINT_LATENCY_BUDGET_QOS(i);
|
||||||
|
ret_readers(i).ownership := ENDPOINT_OWNERSHIP_QOS(i);
|
||||||
|
ret_readers(i).ownership_strength := ENDPOINT_OWNERSHIP_STRENGTH_QOS(i);
|
||||||
|
ret_readers(i).liveliness := ENDPOINT_LIVELINESS_QOS(i);
|
||||||
|
ret_readers(i).leaseDuration := ENDPOINT_LEASE_DURATION(i);
|
||||||
|
ret_readers(i).time_based_filter := ENDPOINT_TIME_BASED_FILTER_QOS(i);
|
||||||
|
ret_readers(i).reliability := ENDPOINT_RELIABILITY_QOS(i);
|
||||||
|
ret_readers(i).max_blocking_time := ENDPOINT_MAX_BLOCKING_TIME(i);
|
||||||
|
ret_readers(i).transportnpriority := ENDPOINT_TRANSPORT_PRIORITY_QOS(i);
|
||||||
|
ret_readers(i).lifespan := ENDPOINT_LIFESPAN_QOS(i);
|
||||||
|
ret_readers(i).destination_order := ENDPOINT_DESTINATION_ORDER_QOS(i);
|
||||||
|
end loop;
|
||||||
|
return ret_readers;
|
||||||
|
else
|
||||||
|
for i in NUM_READERS to NUM_ENDPOINTS-1 loop
|
||||||
|
ret_writers(i-NUM_READERS).topic_name := ENDPOINT_TOPIC(i);
|
||||||
|
ret_writers(i-NUM_READERS).type_name := ENDPOINT_TYPE(i);
|
||||||
|
ret_writers(i-NUM_READERS).durability := ENDPOINT_DURABILITY_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).durability_service_cleanup_delay := ENDPOINT_DURABILITY_SERVICE_CLEANUP_DELAY(i);
|
||||||
|
ret_writers(i-NUM_READERS).durability_service_history := ENDPOINT_DURABILITY_SERVICE_HISTORY(i);
|
||||||
|
ret_writers(i-NUM_READERS).durability_service_history_depth := ENDPOINT_DURABILITY_SERVICE_HISTORY_DEPTH(i);
|
||||||
|
ret_writers(i-NUM_READERS).durability_service_max_samples := ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES(i);
|
||||||
|
ret_writers(i-NUM_READERS).durability_service_max_instances := ENDPOINT_DURABILITY_SERVICE_MAX_INSTANCES(i);
|
||||||
|
ret_writers(i-NUM_READERS).durability_service_max_samples_per_instances := ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE(i);
|
||||||
|
ret_writers(i-NUM_READERS).presentation := ENDPOINT_PRESENTATION_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).coherent_access(0) := boolean_to_std_logic(ENDPOINT_COHERENT_ACCESS(i));
|
||||||
|
ret_writers(i-NUM_READERS).ordered_access(0) := boolean_to_std_logic(ENDPOINT_ORDERED_ACCESS(i));
|
||||||
|
ret_writers(i-NUM_READERS).deadline := ENDPOINT_DEADLINE_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).latency_budget := ENDPOINT_LATENCY_BUDGET_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).ownership := ENDPOINT_OWNERSHIP_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).ownership_strength := ENDPOINT_OWNERSHIP_STRENGTH_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).liveliness := ENDPOINT_LIVELINESS_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).leaseDuration := ENDPOINT_LEASE_DURATION(i);
|
||||||
|
ret_writers(i-NUM_READERS).time_based_filter := ENDPOINT_TIME_BASED_FILTER_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).reliability := ENDPOINT_RELIABILITY_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).max_blocking_time := ENDPOINT_MAX_BLOCKING_TIME(i);
|
||||||
|
ret_writers(i-NUM_READERS).transportnpriority := ENDPOINT_TRANSPORT_PRIORITY_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).lifespan := ENDPOINT_LIFESPAN_QOS(i);
|
||||||
|
ret_writers(i-NUM_READERS).destination_order := ENDPOINT_DESTINATION_ORDER_QOS(i);
|
||||||
|
end loop;
|
||||||
|
return ret_writers;
|
||||||
|
end if;
|
||||||
|
end function;
|
||||||
|
|
||||||
function to_string (input : TEST_MEMORY_TYPE) return string is
|
function to_string (input : TEST_MEMORY_TYPE) return string is
|
||||||
begin
|
begin
|
||||||
return "length: " & integer'image(input'length) & ", start_addr: " & integer'image(input(0).addr) & "end_addr: " & integer'image(input(input'length-1).addr);
|
return "length: " & integer'image(input'length) & ", start_addr: " & integer'image(input(0).addr) & "end_addr: " & integer'image(input(input'length-1).addr);
|
||||||
end function;
|
end function;
|
||||||
|
|
||||||
|
function to_string1 (input : std_logic_vector) return string is
|
||||||
|
begin
|
||||||
|
return "wr: " & to_string(input(0 to NUM_ENDPOINTS-1)) & ", last_word: " & to_string(input(NUM_ENDPOINTS)) & ", data: " & to_hstring(input(NUM_ENDPOINTS+1 to input'length-1));
|
||||||
|
end function;
|
||||||
|
|
||||||
end package body;
|
end package body;
|
||||||
Loading…
Reference in New Issue
Block a user