Problem Statement :
- Consider a DUT which asks for say n chunks of data (n <=200 bytes).
- The driver needs to drive these chunks on the interface.
- Write a transaction class which randomly generates these chunks of data.
- Each chunk of data has to be a collection of beats where the size of all beats except the last one is a multiple of 4 and maximum beat size is 64.
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | class chunk_data #(parameter N =200); rand bit [7:0] data[$]; rand bit [7:0] chunk_size[$]; constraint data_size { data.size == N; } constraint chuuk_size { chunk_size.size inside {[3:25]}; int'(chunk_size.sum) == N-(N%4); foreach(chunk_size[i]) { chunk_size[i]%4 == 0; chunk_size[i] inside {[4:64]}; } } function void post_randomize(); int diff_chunk; diff_chunk = N - chunk_size.sum(); if(diff_chunk != 0) chunk_size.push_back(diff_chunk); endfunction: post_randomize function void display(); $display("=============================="); foreach(chunk_size[i]) $display("Chunk_Size:%0d",chunk_size[i]); endfunction: display endclass: chunk_data module top; parameter N = 199; chunk_data#(N) c; initial begin c = new; repeat(2) begin void'(c.randomize()); c.display(); end end endmodule: top |
Results :
Compiler version L-2016.06; Runtime version L-2016.06; Aug 23 22:38 2020
==============================
Chunk_Size:4
Chunk_Size:4
Chunk_Size:24
Chunk_Size:4
Chunk_Size:20
Chunk_Size:4
Chunk_Size:4
Chunk_Size:36
Chunk_Size:20
Chunk_Size:24
Chunk_Size:4
Chunk_Size:4
Chunk_Size:36
Chunk_Size:8
Chunk_Size:3
==============================
Chunk_Size:56
Chunk_Size:4
Chunk_Size:20
Chunk_Size:8
Chunk_Size:20
Chunk_Size:8
Chunk_Size:4
Chunk_Size:52
Chunk_Size:24
Chunk_Size:3
V C S S i m u l a t i o n R e p o r t
Time: 0
CPU Time: 1.780 seconds; Data structure size: 0.0Mb