Table of Contents

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 the documentation for sources for more detailed information.

Shared parameters

All _multi sources additionally have:

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:

Additionally, for all _en sources:

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<pint D_WIDTH, SOURCE_ID; pbool LOG>
defproc source_simple(chan!(int<D_WIDTH>) O);
 
export template<pint D_WIDTH, OUT_CHANNELS, SOURCE_ID; pbool LOG>
defproc source_simple_multi(chan!(int<D_WIDTH>) O[OUT_CHANNELS]);
 
export template<pint D_WIDTH, SOURCE_ID; pbool LOG>
defproc source_simple(chan!(int<D_WIDTH>) O; bool enable);
 
export template<pint D_WIDTH, OUT_CHANNELS, SOURCE_ID; pbool LOG>
defproc source_simple_multi(chan!(int<D_WIDTH>) 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:

The available sources are:

export template<pint D_WIDTH, MIN_VAL, MAX_VAL, SOURCE_ID; pbool LOG>
defproc source_range(chan!(int<D_WIDTH>) O);
 
export template<pint D_WIDTH, OUT_CHANNELS, MIN_VAL, MAX_VAL, SOURCE_ID; pbool LOG>
defproc source_range_multi(chan!(int<D_WIDTH>) O[OUT_CHANNELS])
 
export template<pint D_WIDTH, MIN_VAL, MAX_VAL, SOURCE_ID; pbool LOG>
defproc source_range_en(chan!(int<D_WIDTH>) O; bool enable)
 
export template<pint D_WIDTH, OUT_CHANNELS, MIN_VAL, MAX_VAL, SOURCE_ID; pbool LOG>
defproc source_range_multi_en(chan!(int<D_WIDTH>) 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.