forked from github/verilator
69 lines
1.5 KiB
Coq
69 lines
1.5 KiB
Coq
|
// DESCRIPTION: Verilator: Verilog Test module
|
||
|
//
|
||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||
|
// without warranty, 2009 by Wilson Snyder.
|
||
|
|
||
|
package defs;
|
||
|
function automatic integer max;
|
||
|
input integer a;
|
||
|
input integer b;
|
||
|
max = (a > b) ? a : b;
|
||
|
endfunction
|
||
|
|
||
|
function automatic integer log2;
|
||
|
input integer value;
|
||
|
value = value >> 1;
|
||
|
for (log2 = 0; value > 0; log2 = log2 + 1)
|
||
|
value = value >> 1;
|
||
|
endfunction
|
||
|
|
||
|
function automatic integer ceil_log2;
|
||
|
input integer value;
|
||
|
value = value - 1;
|
||
|
for (ceil_log2 = 0; value > 0; ceil_log2 = ceil_log2 + 1)
|
||
|
value = value >> 1;
|
||
|
endfunction
|
||
|
endpackage
|
||
|
|
||
|
module sub();
|
||
|
|
||
|
import defs::*;
|
||
|
|
||
|
parameter RAND_NUM_MAX = "";
|
||
|
|
||
|
localparam DATA_RANGE = RAND_NUM_MAX + 1;
|
||
|
localparam DATA_WIDTH = ceil_log2(DATA_RANGE);
|
||
|
localparam WIDTH = max(4, ceil_log2(DATA_RANGE + 1));
|
||
|
|
||
|
endmodule
|
||
|
|
||
|
module t(/*AUTOARG*/
|
||
|
// Inputs
|
||
|
clk
|
||
|
);
|
||
|
|
||
|
import defs::*;
|
||
|
|
||
|
parameter WHICH = 0;
|
||
|
parameter MAX_COUNT = 10;
|
||
|
|
||
|
localparam MAX_EXPONENT = log2(MAX_COUNT);
|
||
|
localparam EXPONENT_WIDTH = ceil_log2(MAX_EXPONENT + 1);
|
||
|
|
||
|
input clk;
|
||
|
|
||
|
generate
|
||
|
if (WHICH == 1)
|
||
|
begin : which_true
|
||
|
sub sub_true();
|
||
|
defparam sub_true.RAND_NUM_MAX = MAX_EXPONENT;
|
||
|
end
|
||
|
else
|
||
|
begin : which_false
|
||
|
sub sub_false();
|
||
|
defparam sub_false.RAND_NUM_MAX = MAX_COUNT;
|
||
|
end
|
||
|
endgenerate
|
||
|
|
||
|
endmodule
|