iverilog/ivtest/ivltests/test_varray1.v

98 lines
2.0 KiB
Verilog

// This module generate M single 2*HW-1 bit vector each T time steps
module stimulus #(parameter W = 8, M = 200, MAX = 256) (
input bit clk, reset,
output reg [W-1:0] x
);
int i;
initial begin
@(negedge reset);
for (i = 0; i < M; i=i+1) begin
@(negedge clk);
x = {$random} % MAX;
end
end
endmodule
module test;
parameter M = 200; // number of test vectors
parameter W = 8; // bit width of input vecotrs
parameter T = 10; // for timing
parameter D = 8; // depth of pipeline, MAX of 8
parameter K = 10; // distance between boundaries of pipeline
parameter S = 2*M*T + 12*D;
parameter MAX = D*K;
bit clk =0, reset = 0;
wire [W-1:0] xin;
wire [W-1:0] din = K;
wire [W-1:0] dout, bout, xout;
wire [2:0] lin = 3'b111; // -1 in fact
wire [2:0] lout;
int x_gold; // for computing expected result
initial forever #T clk = ~clk;
stimulus #(W, M, MAX) stim (.clk(clk), .reset(reset), .x(xin));
diq_array #(W, D) duv (.clk(clk), .reset(reset),
.din(din), .bin(8'd0), .xin(xin), .lin(lin),
.dout(dout), .bout(bout), .xout(xout),
.lout(lout) );
initial begin: checking
@(negedge reset);
@(posedge clk);
repeat (D) @(negedge clk);
forever begin
@(posedge clk);
#1;
// checking dout
if (dout !== din) begin
$display("ERROR");
$finish;
end
// checking bout
if (bout !== MAX) begin
$display("ERROR");
$finish;
end
// checking lout
x_gold = xout-1; // dirty fix, for example xin = 30 muste be reported as 2
if (lout !== x_gold/K) begin
$display("ERROR");
$finish;
end
end
end
initial begin
doreset();
#S;
$display("PASSED");
$finish;
end
task doreset;
begin
@(negedge clk);
reset = 1;
repeat (5) @(negedge clk);
reset = 0;
end
endtask
endmodule