229 lines
5.8 KiB
Systemverilog
229 lines
5.8 KiB
Systemverilog
|
|
// DESCRIPTION: Verilator: Verilog Test module
|
||
|
|
//
|
||
|
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||
|
|
// any use, without warranty, 2025 by Geza Lore.
|
||
|
|
// SPDX-License-Identifier: CC0-1.0
|
||
|
|
|
||
|
|
`define signal(name, expr) wire [$bits(expr)-1:0] ``name = expr
|
||
|
|
|
||
|
|
module t (
|
||
|
|
`include "portlist.vh" // Boilerplate generated by t_dfg_break_cycles.py
|
||
|
|
rand_a, rand_b, srand_a, srand_b
|
||
|
|
);
|
||
|
|
|
||
|
|
`include "portdecl.vh" // Boilerplate generated by t_dfg_break_cycles.py
|
||
|
|
|
||
|
|
input rand_a;
|
||
|
|
input rand_b;
|
||
|
|
input srand_a;
|
||
|
|
input srand_b;
|
||
|
|
wire logic [63:0] rand_a;
|
||
|
|
wire logic [63:0] rand_b;
|
||
|
|
wire logic signed [63:0] srand_a;
|
||
|
|
wire logic signed [63:0] srand_b;
|
||
|
|
|
||
|
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
logic [2:0] simple;
|
||
|
|
always_comb begin
|
||
|
|
simple[0] = rand_a[0];
|
||
|
|
simple[1] = rand_a[1];
|
||
|
|
simple[2] = rand_a[2];
|
||
|
|
end
|
||
|
|
`signal(SIMPLE, simple);
|
||
|
|
|
||
|
|
logic [1:0] reassign;
|
||
|
|
always_comb begin
|
||
|
|
reassign[0] = rand_a[0];
|
||
|
|
reassign[0] = ~rand_a[0];
|
||
|
|
reassign[1] = rand_a[1];
|
||
|
|
reassign[1] = ~rand_a[1];
|
||
|
|
end
|
||
|
|
`signal(REASSIGN, reassign);
|
||
|
|
|
||
|
|
logic [1:0] use_intermediate_a;
|
||
|
|
logic [1:0] use_intermediate_b;
|
||
|
|
always_comb begin
|
||
|
|
use_intermediate_a[0] = rand_a[0];
|
||
|
|
use_intermediate_b[0] = ~use_intermediate_a[0];
|
||
|
|
use_intermediate_a[1] = rand_a[1];
|
||
|
|
use_intermediate_a[0] = ~rand_a[0];
|
||
|
|
use_intermediate_b[1] = ~use_intermediate_a[1];
|
||
|
|
use_intermediate_a[1] = ~rand_a[1];
|
||
|
|
end
|
||
|
|
`signal(USE_INTERMEDIATE, {use_intermediate_a, use_intermediate_b});
|
||
|
|
|
||
|
|
logic [2:0] self_circular;
|
||
|
|
always_comb begin
|
||
|
|
self_circular[0] = rand_a[0];
|
||
|
|
self_circular[1] = ~self_circular[0];
|
||
|
|
self_circular[2] = ~self_circular[1];
|
||
|
|
end
|
||
|
|
`signal(SELF_CIRCULAR, self_circular);
|
||
|
|
|
||
|
|
logic [2:0] part_circular;
|
||
|
|
always_comb begin
|
||
|
|
part_circular[0] = rand_a[0];
|
||
|
|
part_circular[1] = ~part_circular[0];
|
||
|
|
end
|
||
|
|
// part_circular[2] deliberately undriven!
|
||
|
|
`signal(PART_CIRCULAR, part_circular);
|
||
|
|
|
||
|
|
logic [3:0] split_circular;
|
||
|
|
always_comb begin
|
||
|
|
split_circular[0] = rand_a[0];
|
||
|
|
split_circular[2] = rand_a[1];
|
||
|
|
end
|
||
|
|
always_comb begin
|
||
|
|
split_circular[1] = ~split_circular[0];
|
||
|
|
split_circular[3] = ~split_circular[2];
|
||
|
|
end
|
||
|
|
`signal(SPLIT_CIRCULAR, split_circular);
|
||
|
|
|
||
|
|
logic [3:0] conditional_a;
|
||
|
|
always_comb begin
|
||
|
|
conditional_a = 4'd0;
|
||
|
|
if (rand_a[0]) begin
|
||
|
|
conditional_a = rand_b[3:0];
|
||
|
|
end else begin
|
||
|
|
conditional_a = ~rand_b[3:0];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
`signal(CONDITONAL_A, conditional_a);
|
||
|
|
|
||
|
|
logic [3:0] conditional_b;
|
||
|
|
always_comb begin
|
||
|
|
conditional_b = 4'd0;
|
||
|
|
if (rand_a[0]) begin
|
||
|
|
conditional_b = rand_b[3:0];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
`signal(CONDITONAL_B, conditional_b);
|
||
|
|
|
||
|
|
// verilator lint_off LATCH
|
||
|
|
logic [3:0] conditional_c;
|
||
|
|
always_comb begin // nosynth
|
||
|
|
if (rand_a[0]) begin
|
||
|
|
conditional_c = rand_b[3:0];
|
||
|
|
end
|
||
|
|
if (~rand_a[0]) begin
|
||
|
|
conditional_c = ~rand_b[3:0];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
`signal(CONDITONAL_C, conditional_c);
|
||
|
|
// verilator lint_on LATCH
|
||
|
|
|
||
|
|
logic [3:0] conditional_d;
|
||
|
|
always_comb begin
|
||
|
|
if (rand_a[0]) begin
|
||
|
|
conditional_d = rand_b[3:0];
|
||
|
|
end else if (rand_a[1]) begin
|
||
|
|
conditional_d = ~rand_b[3:0];
|
||
|
|
end else begin
|
||
|
|
conditional_d = rand_b[7:4];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
`signal(CONDITONAL_D, conditional_d);
|
||
|
|
|
||
|
|
logic [3:0] conditional_e;
|
||
|
|
always_comb begin
|
||
|
|
conditional_e = 4'd0;
|
||
|
|
if (rand_a[0]) begin
|
||
|
|
conditional_e = rand_b[3:0];
|
||
|
|
end else begin
|
||
|
|
if (rand_a[1]) begin
|
||
|
|
conditional_e = rand_b[3:0];
|
||
|
|
end else begin
|
||
|
|
conditional_e = rand_b[7:4];
|
||
|
|
end
|
||
|
|
conditional_e = ~conditional_e;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
`signal(CONDITONAL_E, conditional_e);
|
||
|
|
|
||
|
|
logic condigional_f;
|
||
|
|
always_comb begin
|
||
|
|
if (rand_b[0]) begin
|
||
|
|
condigional_f = 1'h1;
|
||
|
|
if (rand_b[1]) begin
|
||
|
|
condigional_f = rand_a[0];
|
||
|
|
end
|
||
|
|
end else begin
|
||
|
|
condigional_f = 1'b0;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
`signal(CONDITONAL_F, condigional_f);
|
||
|
|
|
||
|
|
logic [7:0] partial_conditional_a;
|
||
|
|
always_comb begin
|
||
|
|
partial_conditional_a[1:0] = 2'd0;
|
||
|
|
if (rand_a[0]) begin
|
||
|
|
partial_conditional_a[0] = rand_b[0];
|
||
|
|
end else begin
|
||
|
|
partial_conditional_a[1] = rand_b[1];
|
||
|
|
end
|
||
|
|
partial_conditional_a[4:3] = rand_b[4:3];
|
||
|
|
end
|
||
|
|
`signal(PARTIAL_CONDITONAL_A, partial_conditional_a);
|
||
|
|
|
||
|
|
logic [3:0] partial_conditional_b;
|
||
|
|
always_comb begin
|
||
|
|
partial_conditional_b[1:0] = 2'd0;
|
||
|
|
if (rand_a[0]) begin
|
||
|
|
partial_conditional_b[0] = rand_b[0];
|
||
|
|
end
|
||
|
|
if (rand_a[1]) begin
|
||
|
|
partial_conditional_b[1] = rand_b[1];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
`signal(PARTIAL_CONDITONAL_B, partial_conditional_b);
|
||
|
|
|
||
|
|
logic [3:0] becomes_full;
|
||
|
|
always_comb begin
|
||
|
|
becomes_full[2:0] = rand_a[2:0];
|
||
|
|
becomes_full[3] = ~rand_a[3];
|
||
|
|
if (rand_b[0]) begin
|
||
|
|
becomes_full = ~becomes_full;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
`signal(BECOMES_FULL, becomes_full);
|
||
|
|
|
||
|
|
// verilator lint_off LATCH
|
||
|
|
logic [3:0] latch_a;
|
||
|
|
logic [3:0] latch_b;
|
||
|
|
always_comb begin // nosynth
|
||
|
|
if (rand_b[0]) begin
|
||
|
|
latch_a[3:1] = ~rand_a[3:1];
|
||
|
|
end
|
||
|
|
latch_b = latch_a;
|
||
|
|
end
|
||
|
|
assign latch_a[0] = rand_a[0];
|
||
|
|
`signal(LATCH, latch_b);
|
||
|
|
// verilator lint_on LATCH
|
||
|
|
|
||
|
|
// verilator lint_off MULTIDRIVEN
|
||
|
|
logic static_temporary_a;
|
||
|
|
logic static_temporary_b;
|
||
|
|
logic static_temporary_tmp;
|
||
|
|
always_comb begin // revert
|
||
|
|
static_temporary_tmp = rand_a[0];
|
||
|
|
static_temporary_a = ~static_temporary_tmp;
|
||
|
|
end
|
||
|
|
always_comb begin // revert
|
||
|
|
static_temporary_tmp = static_temporary_a;
|
||
|
|
static_temporary_b = ~static_temporary_tmp;
|
||
|
|
end
|
||
|
|
// verilator lint_on MULTIDRIVEN
|
||
|
|
`signal(STATIC_TEMPORARY, {static_temporary_tmp, static_temporary_b, static_temporary_a, rand_a[0]});
|
||
|
|
|
||
|
|
logic [2:0] partial_temporary_a;
|
||
|
|
logic [2:0] partial_temporary_tmp;
|
||
|
|
always_comb begin
|
||
|
|
partial_temporary_tmp[2] = rand_a[3];
|
||
|
|
partial_temporary_tmp[1] = rand_a[2];
|
||
|
|
partial_temporary_tmp[0] = rand_a[1];
|
||
|
|
partial_temporary_a = partial_temporary_tmp;
|
||
|
|
end
|
||
|
|
`signal(PARTIAL_TEMPORARY, partial_temporary_a);
|
||
|
|
endmodule
|