60 lines
1.0 KiB
Coq
60 lines
1.0 KiB
Coq
|
|
// This module generate M single 2*HW-1 bit vector each T time steps
|
||
|
|
|
||
|
|
module stimulus #(parameter HW = 4, T = 10, M = 200) (
|
||
|
|
output reg [2*HW-1:0] a
|
||
|
|
);
|
||
|
|
|
||
|
|
int i;
|
||
|
|
int MAX;
|
||
|
|
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
MAX = 1 << 2*HW;
|
||
|
|
for (i = 0; i < M; i=i+1) begin
|
||
|
|
a = $random % MAX ;
|
||
|
|
#T;
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
endmodule
|
||
|
|
|
||
|
|
// This module always checks that y complies with an XOR reduction operation on 2*HW-1 bits input as x
|
||
|
|
|
||
|
|
module check #(parameter HW = 4) (input [2*HW-1:0] x, input y);
|
||
|
|
|
||
|
|
wire yi = ^x;
|
||
|
|
|
||
|
|
always @(y, yi) begin
|
||
|
|
#1;
|
||
|
|
if (y !== yi) begin
|
||
|
|
$display("ERROR");
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
endmodule
|
||
|
|
|
||
|
|
|
||
|
|
module test;
|
||
|
|
parameter M = 200; // number of test vectors
|
||
|
|
parameter T = 10; // time step unit
|
||
|
|
parameter HW = 4; // bit width of input vecotrs
|
||
|
|
parameter S = M*T + 40;
|
||
|
|
|
||
|
|
wire [2*HW-1:0] a;
|
||
|
|
wire y;
|
||
|
|
|
||
|
|
stimulus #(HW, T, M) stim (.a(a));
|
||
|
|
gxor_reduce #(HW) duv (.a(a), .ar(y));
|
||
|
|
check check (.x(a), .y(y) );
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
#S;
|
||
|
|
$display("PASSED");
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
|
||
|
|
endmodule
|