forked from github/verilator
268 lines
11 KiB
Systemverilog
Executable File
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
|