====== Randomness ====== The ''sim::rand'' namespace contains support for random number generation, and includes the definition of a number of processes that use this random number generation functionality. The underlying random number generator used is a pseudo-random number generator, and hence the sequence of "random" numbers is deterministic. To ensure that these numbers remain unchanged on different platforms, we use a local mirror of the ''rand_r'' function from glibc. There are two main sources providing a stream of random tokens in this namespace, full range and constrained range. Additionally, the functions for creating your own random source are also exposed. As with normal sources, there are four versions per source type (permutations with and without ''_multi'' and ''_en''). Please see [[sim:sources | the documentation for sources]] for more detailed information. ===== Shared parameters ===== * ''D_WIDTH'': The bit width of the data bus * ''SOURCE_ID'': ID of the source to be used in log output * ''LOG'': Toggles whether or not the source should post a log line whenever a token is emitted All ''_multi'' sources additionally have: * ''OUT_CHANNELS'': Number of output channels on which the token should be emitted The parameter order for all components generally is ''[interface] [variant settings] [logging]''; this translates into a general parameter order of ''D_WIDTH, [OUT_CHANNELS, ] (source specifics), SOURCE_ID, LOG'' for all sources. ===== Interface ===== All sources have an identical output interface: * ''O'': Singular output channel for normal and array of size ''OUT_CHANNELS'' for all ''_multi'' sources Additionally, for all ''_en'' sources: * ''enable'': Source only emits tokens if this flag is high ===== Source types ===== ==== Simple source ==== This source will initialize a pseudorandom number generator and start generating random numbers in the full bit width of the output channel. It has no additional parameters. The available sources are: export template defproc source_simple(chan!(int) O); export template defproc source_simple_multi(chan!(int) O[OUT_CHANNELS]); export template defproc source_simple(chan!(int) O; bool enable); export template defproc source_simple_multi(chan!(int) O[OUT_CHANNELS]; bool enable); ==== Range source ==== This source will initialize a pseudorandom number generator and start generating random numbers in the parameter given range. These additional parameters are: * ''MIN_VAL'': The lower bound of the range in which to generate random numbers in * ''MAX_VAL'': The upper bound of the range in which to generate random numbers in The available sources are: export template defproc source_range(chan!(int) O); export template defproc source_range_multi(chan!(int) O[OUT_CHANNELS]) export template defproc source_range_en(chan!(int) O; bool enable) export template defproc source_range_multi_en(chan!(int) O[OUT_CHANNELS]; bool enable) ===== Functions ===== The functions used to use (pseudo) random number generators are also exported and available for use outside the sim library. These are the following: function init(int<8> data_width) : int<32>; function init_range(int<8> data_width; int<32> minval, maxval) : int<32>; These initialize the PRG and return an identifier to be used in subsequent calls to the functions below to access the generator. ''init'' initializes a random number generator of the specified bit-width, while ''init_range'' specifies an interval over which the random number is supposed to be uniformly distributed. function get(int<32> prg_id) : int<64>; Returns the next random number from the generator specified by index ''prg_id''. function seed(int<32> prg_id; int<32> seed) : bool; Set the seed for the random number generator ''prg_id'' to the value ''seed''. As with every other function, the result has to be saved in a dummy variable to prevent being optimized away.