88 lines
1.7 KiB
Coq
88 lines
1.7 KiB
Coq
|
|
/*
|
||
|
|
* This module is a test bench for the sqrt32 module. It runs some
|
||
|
|
* test input values through the sqrt32 module, and checks that the
|
||
|
|
* output is valid. If an invalid output is generated, print and
|
||
|
|
* error message and stop immediately. If all the tested values pass,
|
||
|
|
* then print PASSED after the test is complete.
|
||
|
|
*/
|
||
|
|
module main;
|
||
|
|
|
||
|
|
reg [31:0] x;
|
||
|
|
reg clk, reset;
|
||
|
|
|
||
|
|
wire [15:0] y;
|
||
|
|
wire rdy;
|
||
|
|
|
||
|
|
chip_root dut(.clk(clk), .reset(reset), .rdy(rdy), .x(x), .y(y));
|
||
|
|
|
||
|
|
(* ivl_synthesis_off *)
|
||
|
|
always #5 clk = !clk;
|
||
|
|
|
||
|
|
task reset_dut;
|
||
|
|
begin
|
||
|
|
reset = 1;
|
||
|
|
#1 reset = 0;
|
||
|
|
@(negedge clk) ;
|
||
|
|
end
|
||
|
|
endtask // reset_dut
|
||
|
|
|
||
|
|
task crank_dut;
|
||
|
|
begin
|
||
|
|
while (rdy == 0) begin
|
||
|
|
@(posedge clk) /* wait */;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
endtask // crank_dut
|
||
|
|
|
||
|
|
reg GSR;
|
||
|
|
assign glbl.GSR = GSR;
|
||
|
|
|
||
|
|
integer idx;
|
||
|
|
|
||
|
|
(* ivl_synthesis_off *)
|
||
|
|
initial begin
|
||
|
|
reset = 0;
|
||
|
|
clk = 0;
|
||
|
|
|
||
|
|
/* If doing a post-map simulation, when we need to wiggle
|
||
|
|
The GSR bit to simulate chip power-up. */
|
||
|
|
GSR = 1;
|
||
|
|
#100 GSR = 0;
|
||
|
|
#100 x = 1;
|
||
|
|
reset_dut;
|
||
|
|
crank_dut;
|
||
|
|
$display("x=%d, y=%d", x, y);
|
||
|
|
|
||
|
|
x = 3;
|
||
|
|
reset_dut;
|
||
|
|
crank_dut;
|
||
|
|
$display("x=%d, y=%d", x, y);
|
||
|
|
|
||
|
|
x = 4;
|
||
|
|
reset_dut;
|
||
|
|
crank_dut;
|
||
|
|
$display("x=%d, y=%d", x, y);
|
||
|
|
|
||
|
|
for (idx = 0 ; idx < 200 ; idx = idx + 1) begin
|
||
|
|
x = $random;
|
||
|
|
reset_dut;
|
||
|
|
crank_dut;
|
||
|
|
$display("x=%d, y=%d", x, y);
|
||
|
|
|
||
|
|
if (x < (y * y)) begin
|
||
|
|
$display("ERROR: y is too big");
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
|
||
|
|
if (x > ((y + 1)*(y + 1))) begin
|
||
|
|
$display("ERROR: y is too small");
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
$display("PASSED");
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
|
||
|
|
endmodule // main
|