178 lines
4.3 KiB
Systemverilog
178 lines
4.3 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain.
|
|
// SPDX-FileCopyrightText: 2004 Wilson Snyder
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
module t (
|
|
input clk
|
|
);
|
|
|
|
|
|
reg [2:0] index_a;
|
|
reg [2:0] index_b;
|
|
|
|
prover #(4) p4 ( /*AUTOINST*/
|
|
// Inputs
|
|
.clk(clk),
|
|
.index_a(index_a),
|
|
.index_b(index_b)
|
|
);
|
|
prover #(32) p32 ( /*AUTOINST*/
|
|
// Inputs
|
|
.clk(clk),
|
|
.index_a(index_a),
|
|
.index_b(index_b)
|
|
);
|
|
prover #(63) p63 ( /*AUTOINST*/
|
|
// Inputs
|
|
.clk(clk),
|
|
.index_a(index_a),
|
|
.index_b(index_b)
|
|
);
|
|
prover #(64) p64 ( /*AUTOINST*/
|
|
// Inputs
|
|
.clk(clk),
|
|
.index_a(index_a),
|
|
.index_b(index_b)
|
|
);
|
|
prover #(72) p72 ( /*AUTOINST*/
|
|
// Inputs
|
|
.clk(clk),
|
|
.index_a(index_a),
|
|
.index_b(index_b)
|
|
);
|
|
prover #(126) p126 ( /*AUTOINST*/
|
|
// Inputs
|
|
.clk(clk),
|
|
.index_a(index_a),
|
|
.index_b(index_b)
|
|
);
|
|
prover #(128) p128 ( /*AUTOINST*/
|
|
// Inputs
|
|
.clk(clk),
|
|
.index_a(index_a),
|
|
.index_b(index_b)
|
|
);
|
|
|
|
integer cyc;
|
|
initial cyc = 0;
|
|
initial index_a = 3'b0;
|
|
initial index_b = 3'b0;
|
|
always @* begin
|
|
index_a = cyc[2:0];
|
|
if (index_a > 3'd4) index_a = 3'd4;
|
|
index_b = cyc[5:3];
|
|
if (index_b > 3'd4) index_b = 3'd4;
|
|
end
|
|
|
|
always @(posedge clk) begin
|
|
cyc <= cyc + 1;
|
|
if (cyc == 99) begin
|
|
$write("*-* All Finished *-*\n");
|
|
$finish;
|
|
end
|
|
end
|
|
|
|
endmodule
|
|
|
|
|
|
module prover (
|
|
input clk,
|
|
input [2:0] index_a,
|
|
input [2:0] index_b
|
|
);
|
|
|
|
parameter WIDTH = 4;
|
|
|
|
|
|
reg signed [WIDTH-1:0] as;
|
|
reg signed [WIDTH-1:0] bs;
|
|
wire [WIDTH-1:0] b = bs;
|
|
|
|
// verilator lint_off LATCH
|
|
always @* begin
|
|
casez (index_a)
|
|
3'd0: as = {(WIDTH) {1'd0}}; // 0
|
|
3'd1: as = {{(WIDTH - 1) {1'd0}}, 1'b1}; // 1
|
|
3'd2: as = {1'b0, {(WIDTH - 1) {1'd0}}}; // 127 or equiv
|
|
3'd3: as = {(WIDTH) {1'd1}}; // -1
|
|
3'd4: as = {1'b1, {(WIDTH - 1) {1'd0}}}; // -128 or equiv
|
|
default: $stop;
|
|
endcase
|
|
casez (index_b)
|
|
3'd0: bs = {(WIDTH) {1'd0}}; // 0
|
|
3'd1: bs = {{(WIDTH - 1) {1'd0}}, 1'b1}; // 1
|
|
3'd2: bs = {1'b0, {(WIDTH - 1) {1'd0}}}; // 127 or equiv
|
|
3'd3: bs = {(WIDTH) {1'd1}}; // -1
|
|
3'd4: bs = {1'b1, {(WIDTH - 1) {1'd0}}}; // -128 or equiv
|
|
default: $stop;
|
|
endcase
|
|
end
|
|
// verilator lint_on LATCH
|
|
|
|
reg [7:0] results[4:0][4:0];
|
|
|
|
wire gt = as > b;
|
|
wire gts = as > bs;
|
|
wire gte = as >= b;
|
|
wire gtes = as >= bs;
|
|
wire lt = as < b;
|
|
wire lts = as < bs;
|
|
wire lte = as <= b;
|
|
wire ltes = as <= bs;
|
|
|
|
reg [7:0] exp;
|
|
reg [7:0] got;
|
|
|
|
integer cyc = 0;
|
|
always @(posedge clk) begin
|
|
cyc <= cyc + 1;
|
|
if (cyc > 2) begin
|
|
`ifdef TEST_VERBOSE
|
|
$write("results[%d][%d] = 8'b%b_%b_%b_%b_%b_%b_%b_%b;\n", index_a, index_b, gt, gts, gte,
|
|
gtes, lt, lts, lte, ltes);
|
|
`endif
|
|
exp = results[index_a][index_b];
|
|
got = {gt, gts, gte, gtes, lt, lts, lte, ltes};
|
|
if (exp !== got) begin
|
|
$display("%%Error: bad comparison width=%0d: %d/%d got=%b exp=%b", WIDTH, index_a, index_b,
|
|
got, exp);
|
|
$stop;
|
|
end
|
|
end
|
|
end
|
|
|
|
// Result table
|
|
initial begin
|
|
// Indexes: 0, 1, -1, 127, -128
|
|
// Gt Gts Gte Gtes Lt Lts Lte Ltes
|
|
results[0][0] = 8'b0_0_1_1_0_0_1_1;
|
|
results[0][1] = 8'b0_0_0_0_1_1_1_1;
|
|
results[0][2] = 8'b0_0_1_1_0_0_1_1;
|
|
results[0][3] = 8'b0_1_0_1_1_0_1_0;
|
|
results[0][4] = 8'b0_1_0_1_1_0_1_0;
|
|
results[1][0] = 8'b1_1_1_1_0_0_0_0;
|
|
results[1][1] = 8'b0_0_1_1_0_0_1_1;
|
|
results[1][2] = 8'b1_1_1_1_0_0_0_0;
|
|
results[1][3] = 8'b0_1_0_1_1_0_1_0;
|
|
results[1][4] = 8'b0_1_0_1_1_0_1_0;
|
|
results[2][0] = 8'b0_0_1_1_0_0_1_1;
|
|
results[2][1] = 8'b0_0_0_0_1_1_1_1;
|
|
results[2][2] = 8'b0_0_1_1_0_0_1_1;
|
|
results[2][3] = 8'b0_1_0_1_1_0_1_0;
|
|
results[2][4] = 8'b0_1_0_1_1_0_1_0;
|
|
results[3][0] = 8'b1_0_1_0_0_1_0_1;
|
|
results[3][1] = 8'b1_0_1_0_0_1_0_1;
|
|
results[3][2] = 8'b1_0_1_0_0_1_0_1;
|
|
results[3][3] = 8'b0_0_1_1_0_0_1_1;
|
|
results[3][4] = 8'b1_1_1_1_0_0_0_0;
|
|
results[4][0] = 8'b1_0_1_0_0_1_0_1;
|
|
results[4][1] = 8'b1_0_1_0_0_1_0_1;
|
|
results[4][2] = 8'b1_0_1_0_0_1_0_1;
|
|
results[4][3] = 8'b0_0_0_0_1_1_1_1;
|
|
results[4][4] = 8'b0_0_1_1_0_0_1_1;
|
|
end
|
|
|
|
endmodule
|