verilator/test_regress/t/t_gate_ormux.v
2020-03-21 11:24:24 -04:00

268 lines
11 KiB
Systemverilog
Executable File

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2020 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
module t (/*AUTOARG*/
// Inputs
clk
);
input clk;
integer cyc=0;
reg [63:0] crc;
reg [63:0] sum;
logic [31:0] rdata;
logic [31:0] rdata2;
wire [31:0] wdata = crc[31:0];
wire [15:0] sel = {11'h0, crc[36:32]};
wire we = crc[48];
Test test (/*AUTOINST*/
// Outputs
.rdata (rdata[31:0]),
.rdata2 (rdata2[31:0]),
// Inputs
.clk (clk),
.we (we),
.sel (sel[15:0]),
.wdata (wdata[31:0]));
// 5.07 4.42 -> 13%
wire [63:0] result = {rdata2, rdata};
// Test loop
always @ (posedge clk) begin
`ifdef TEST_VERBOSE
$write("[%0t] cyc==%0d crc=%x result=%x\n",$time, cyc, crc, result);
`endif
cyc <= cyc + 1;
crc <= {crc[62:0], crc[63]^crc[2]^crc[0]};
sum <= result ^ {sum[62:0],sum[63]^sum[2]^sum[0]};
if (rdata2 != rdata) $stop;
if (cyc==0) begin
// Setup
crc <= 64'h5aef0c8d_d70a4497;
sum <= '0;
end
else if (cyc<10) begin
sum <= '0;
end
else if (cyc == 99) begin
$write("[%0t] cyc==%0d crc=%x sum=%x\n",$time, cyc, crc, sum);
if (crc !== 64'hc77bb9b3784ea091) $stop;
`define EXPECTED_SUM 64'h8977713eb467bc86
if (sum !== `EXPECTED_SUM) $stop;
end
else if (cyc == `SIM_CYCLES) begin
$write("[%0t] cyc==%0d crc=%x sum=%x\n",$time, cyc, crc, sum);
$write("*-* All Finished *-*\n");
$finish;
end
end
endmodule
module Test(/*AUTOARG*/
// Outputs
rdata, rdata2,
// Inputs
clk, we, sel, wdata
);
input clk;
input we;
input [15:0] sel;
input [31:0] wdata;
output logic [31:0] rdata;
output logic [31:0] rdata2;
logic we_d1r;
logic [15:0] sel_d1r;
logic [31:0] wdata_d1r;
always_ff @ (posedge clk) begin
we_d1r <= we;
sel_d1r <= sel;
wdata_d1r <= wdata;
end
reg [31:0] csr0000;
reg [31:0] csr0001;
reg [31:0] csr0002;
reg [31:0] csr0003;
reg [31:0] csr0004;
reg [31:0] csr0005;
reg [31:0] csr0006;
reg [31:0] csr0007;
reg [31:0] csr0008;
reg [31:0] csr0009;
reg [31:0] csr000a;
reg [31:0] csr000b;
reg [31:0] csr000c;
reg [31:0] csr000d;
reg [31:0] csr000e;
reg [31:0] csr000f;
wire [31:0] csr0010 = 32'h33675230;
wire [31:0] csr0011 = 32'h00fa2144;
wire [31:0] csr0012 = 32'h6a5e8e10;
wire [31:0] csr0013 = 32'h000a5b5e;
wire [31:0] csr0014 = 32'h002fe51b;
wire [31:0] csr0015 = 32'h00027e00;
wire [31:0] csr0016 = 32'h0000e3c0;
wire [31:0] csr0017 = 32'h00efcf16;
wire [31:0] csr0018 = 32'h007a2600;
wire [31:0] csr0019 = 32'h0a4a9f10;
wire [31:0] csr001a = 32'h7d789de3;
wire [31:0] csr001b = 32'h40f655f9;
wire [31:0] csr001c = 32'hadad01f4;
wire [31:0] csr001d = 32'h02e7b33c;
wire [31:0] csr001e = 32'h12101533;
wire [31:0] csr001f = 32'h2cc1cce5;
initial begin
csr0000 = 32'he172d365;
csr0001 = 32'h35cc25e2;
csr0002 = 32'haf48436e;
csr0003 = 32'h135e55e4;
csr0004 = 32'h5fd6e48a;
csr0005 = 32'hb07d34ad;
csr0006 = 32'h2aa05deb;
csr0007 = 32'hfe97b680;
csr0008 = 32'h960f20bb;
csr0009 = 32'h251129f0;
csr000a = 32'hef3d2f93;
csr000b = 32'hef4bc127;
csr000c = 32'h3dfecb10;
csr000d = 32'h1b4690f5;
csr000e = 32'ha07822ab;
csr000f = 32'hf817cbf6;
end
always_ff @ (posedge clk) begin
if (we_d1r && sel_d1r == 16'h0000) csr0000 <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h0001) csr0001 <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h0002) csr0002 <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h0003) csr0003 <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h0004) csr0004 <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h0005) csr0005 <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h0006) csr0006 <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h0007) csr0007 <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h0008) csr0008 <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h0009) csr0009 <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h000a) csr000a <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h000b) csr000b <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h000c) csr000c <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h000d) csr000d <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h000e) csr000e <= wdata_d1r;
if (we_d1r && sel_d1r == 16'h000f) csr000f <= wdata_d1r;
end
wire dec0000 = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && !sel_d1r[3] && !sel_d1r[2] && !sel_d1r[1] && !sel_d1r[0];
wire dec0001 = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && !sel_d1r[3] && !sel_d1r[2] && !sel_d1r[1] && sel_d1r[0];
wire dec0002 = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && !sel_d1r[3] && !sel_d1r[2] && sel_d1r[1] && !sel_d1r[0];
wire dec0003 = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && !sel_d1r[3] && !sel_d1r[2] && sel_d1r[1] && sel_d1r[0];
wire dec0004 = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && !sel_d1r[3] && sel_d1r[2] && !sel_d1r[1] && !sel_d1r[0];
wire dec0005 = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && !sel_d1r[3] && sel_d1r[2] && !sel_d1r[1] && sel_d1r[0];
wire dec0006 = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && !sel_d1r[3] && sel_d1r[2] && sel_d1r[1] && !sel_d1r[0];
wire dec0007 = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && !sel_d1r[3] && sel_d1r[2] && sel_d1r[1] && sel_d1r[0];
wire dec0008 = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && sel_d1r[3] && !sel_d1r[2] && !sel_d1r[1] && !sel_d1r[0];
wire dec0009 = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && sel_d1r[3] && !sel_d1r[2] && !sel_d1r[1] && sel_d1r[0];
wire dec000a = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && sel_d1r[3] && !sel_d1r[2] && sel_d1r[1] && !sel_d1r[0];
wire dec000b = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && sel_d1r[3] && !sel_d1r[2] && sel_d1r[1] && sel_d1r[0];
wire dec000c = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && sel_d1r[3] && sel_d1r[2] && !sel_d1r[1] && !sel_d1r[0];
wire dec000d = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && sel_d1r[3] && sel_d1r[2] && !sel_d1r[1] && sel_d1r[0];
wire dec000e = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && sel_d1r[3] && sel_d1r[2] && sel_d1r[1] && !sel_d1r[0];
wire dec000f = sel_d1r[15:6] == 0 && !sel_d1r[5] && !sel_d1r[4] && sel_d1r[3] && sel_d1r[2] && sel_d1r[1] && sel_d1r[0];
wire dec0010 = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && !sel_d1r[3] && !sel_d1r[2] && !sel_d1r[1] && !sel_d1r[0];
wire dec0011 = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && !sel_d1r[3] && !sel_d1r[2] && !sel_d1r[1] && sel_d1r[0];
wire dec0012 = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && !sel_d1r[3] && !sel_d1r[2] && sel_d1r[1] && !sel_d1r[0];
wire dec0013 = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && !sel_d1r[3] && !sel_d1r[2] && sel_d1r[1] && sel_d1r[0];
wire dec0014 = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && !sel_d1r[3] && sel_d1r[2] && !sel_d1r[1] && !sel_d1r[0];
wire dec0015 = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && !sel_d1r[3] && sel_d1r[2] && !sel_d1r[1] && sel_d1r[0];
wire dec0016 = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && !sel_d1r[3] && sel_d1r[2] && sel_d1r[1] && !sel_d1r[0];
wire dec0017 = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && !sel_d1r[3] && sel_d1r[2] && sel_d1r[1] && sel_d1r[0];
wire dec0018 = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && sel_d1r[3] && !sel_d1r[2] && !sel_d1r[1] && !sel_d1r[0];
wire dec0019 = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && sel_d1r[3] && !sel_d1r[2] && !sel_d1r[1] && sel_d1r[0];
wire dec001a = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && sel_d1r[3] && !sel_d1r[2] && sel_d1r[1] && !sel_d1r[0];
wire dec001b = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && sel_d1r[3] && !sel_d1r[2] && sel_d1r[1] && sel_d1r[0];
wire dec001c = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && sel_d1r[3] && sel_d1r[2] && !sel_d1r[1] && !sel_d1r[0];
wire dec001d = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && sel_d1r[3] && sel_d1r[2] && !sel_d1r[1] && sel_d1r[0];
wire dec001e = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && sel_d1r[3] && sel_d1r[2] && sel_d1r[1] && !sel_d1r[0];
wire dec001f = sel_d1r[15:6] == 0 && !sel_d1r[5] && sel_d1r[4] && sel_d1r[3] && sel_d1r[2] && sel_d1r[1] && sel_d1r[0];
assign rdata = (32'h0
| {32{dec0000}} & csr0000
| {32{dec0001}} & csr0001
| {32{dec0002}} & csr0002
| {32{dec0003}} & csr0003
| {32{dec0004}} & csr0004
| {32{dec0005}} & csr0005
| {32{dec0006}} & csr0006
| {32{dec0007}} & csr0007
| {32{dec0008}} & csr0008
| {32{dec0009}} & csr0009
| {32{dec000a}} & csr000a
| {32{dec000b}} & csr000b
| {32{dec000c}} & csr000c
| {32{dec000d}} & csr000d
| {32{dec000e}} & csr000e
| {32{dec000f}} & csr000f
| {32{dec0010}} & csr0010
| {32{dec0011}} & csr0011
| {32{dec0012}} & csr0012
| {32{dec0013}} & csr0013
| {32{dec0014}} & csr0014
| {32{dec0015}} & csr0015
| {32{dec0016}} & csr0016
| {32{dec0017}} & csr0017
| {32{dec0018}} & csr0018
| {32{dec0019}} & csr0019
| {32{dec001a}} & csr001a
| {32{dec001b}} & csr001b
| {32{dec001c}} & csr001c
| {32{dec001d}} & csr001d
| {32{dec001e}} & csr001e
| {32{dec001f}} & csr001f
);
always_comb begin
case (sel_d1r)
16'h0000: rdata2 = csr0000;
16'h0001: rdata2 = csr0001;
16'h0002: rdata2 = csr0002;
16'h0003: rdata2 = csr0003;
16'h0004: rdata2 = csr0004;
16'h0005: rdata2 = csr0005;
16'h0006: rdata2 = csr0006;
16'h0007: rdata2 = csr0007;
16'h0008: rdata2 = csr0008;
16'h0009: rdata2 = csr0009;
16'h000a: rdata2 = csr000a;
16'h000b: rdata2 = csr000b;
16'h000c: rdata2 = csr000c;
16'h000d: rdata2 = csr000d;
16'h000e: rdata2 = csr000e;
16'h000f: rdata2 = csr000f;
16'h0010: rdata2 = csr0010;
16'h0011: rdata2 = csr0011;
16'h0012: rdata2 = csr0012;
16'h0013: rdata2 = csr0013;
16'h0014: rdata2 = csr0014;
16'h0015: rdata2 = csr0015;
16'h0016: rdata2 = csr0016;
16'h0017: rdata2 = csr0017;
16'h0018: rdata2 = csr0018;
16'h0019: rdata2 = csr0019;
16'h001a: rdata2 = csr001a;
16'h001b: rdata2 = csr001b;
16'h001c: rdata2 = csr001c;
16'h001d: rdata2 = csr001d;
16'h001e: rdata2 = csr001e;
16'h001f: rdata2 = csr001f;
default: rdata2 = 0;
endcase
end
endmodule