iverilog/ivtest/ivltests/pr2835632a.v

858 lines
31 KiB
Verilog

// This checks various constant selects using the indexed select operators
// +: and -: for both big and little endian vectors.
`ifdef __ICARUS__
`define SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
`endif
module top;
parameter base = -1;
parameter [base+15:base] p_big = 16'h0123;
parameter [base:base+15] p_ltl = 16'h3210;
parameter p_base = 16'h0123;
reg [base+15:base] big = 16'h0123;
reg [base:base+15] ltl = 16'h3210;
reg [base+15:base] big_l;
reg [base:base+15] ltl_l;
wire [base+15:base] w_big = 16'h0123;
wire [base:base+15] w_ltl = 16'h3210;
reg [3:0] big0, big1, big2, big3, ltl0, ltl1, ltl2, ltl3;
reg [3:0] big0a, big3a, bigx, bigo, ltl0a, ltl3a, ltlx, ltlo;
reg pass;
/*
* Check a constant +: as a CA R-value.
*/
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
wire [3:0] wcu_big3a = w_big[(base-1)+:4];
`else
wire [3:0] wcu_big3a = {w_big[(base)+:3],1'bx};
`endif
wire [3:0] wcu_big3 = w_big[(base)+:4];
wire [3:0] wcu_big2 = w_big[(base+4)+:4];
wire [3:0] wcu_big1 = w_big[(base+8)+:4];
wire [3:0] wcu_big0 = w_big[(base+12)+:4];
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
wire [3:0] wcu_big0a = w_big[(base+13)+:4];
wire [3:0] wcu_bigx = w_big[(1'bx)+:4];
wire [3:0] wcu_ltl3a = w_ltl[(base-1)+:4];
`else
wire [3:0] wcu_big0a = {1'bx,w_big[(base+13)+:3]};
wire [3:0] wcu_bigx = 4'bxxxx;
wire [3:0] wcu_ltl3a = {1'bx,w_ltl[(base)+:3]};
`endif
wire [3:0] wcu_ltl3 = w_ltl[(base)+:4];
wire [3:0] wcu_ltl2 = w_ltl[(base+4)+:4];
wire [3:0] wcu_ltl1 = w_ltl[(base+8)+:4];
wire [3:0] wcu_ltl0 = w_ltl[(base+12)+:4];
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
wire [3:0] wcu_ltl0a = w_ltl[(base+13)+:4];
wire [3:0] wcu_ltlx = w_ltl[(1'bx)+:4];
`else
wire [3:0] wcu_ltl0a = {w_ltl[(base+13)+:3],1'bx};
wire [3:0] wcu_ltlx = 4'bxxxx;
`endif
/*
* Check a constant -: as a CA R-value.
*/
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
wire [3:0] wcd_big3a = w_big[(base+2)-:4];
`else
wire [3:0] wcd_big3a = {w_big[(base+2)-:3],1'bx};
`endif
wire [3:0] wcd_big3 = w_big[(base+3)-:4];
wire [3:0] wcd_big2 = w_big[(base+7)-:4];
wire [3:0] wcd_big1 = w_big[(base+11)-:4];
wire [3:0] wcd_big0 = w_big[(base+15)-:4];
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
wire [3:0] wcd_big0a = w_big[(base+16)-:4];
wire [3:0] wcd_bigx = w_big[(1'bx)-:4];
wire [3:0] wcd_ltl3a = w_ltl[(base+2)-:4];
`else
wire [3:0] wcd_big0a = {1'bx,w_big[(base+15)-:3]};
wire [3:0] wcd_bigx = 4'bxxxx;
wire [3:0] wcd_ltl3a = {1'bx,w_ltl[(base+2)-:3]};
`endif
wire [3:0] wcd_ltl3 = w_ltl[(base+3)-:4];
wire [3:0] wcd_ltl2 = w_ltl[(base+7)-:4];
wire [3:0] wcd_ltl1 = w_ltl[(base+11)-:4];
wire [3:0] wcd_ltl0 = w_ltl[(base+15)-:4];
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
wire [3:0] wcd_ltl0a = w_ltl[(base+16)-:4];
wire [3:0] wcd_ltlx = w_ltl[(1'bx)-:4];
`else
wire [3:0] wcd_ltl0a = {w_ltl[(base+15)-:3],1'bx};
wire [3:0] wcd_ltlx = 4'bxxxx;
`endif
/*
* Check a constant +: as a CA L-value.
*/
wire [base+15:base] wcu_big_l;
wire [base:base+15] wcu_ltl_l;
assign wcu_big_l[(base)+:4] = 4'd3;
assign wcu_big_l[(base+4)+:4] = 4'd2;
assign wcu_big_l[(base+8)+:4] = 4'd1;
assign wcu_big_l[(base+12)+:4] = 4'd0;
assign wcu_ltl_l[(base)+:4] = 4'd3;
assign wcu_ltl_l[(base+4)+:4] = 4'd2;
assign wcu_ltl_l[(base+8)+:4] = 4'd1;
assign wcu_ltl_l[(base+12)+:4] = 4'd0;
/*
* Check a constant -: as a CA L-value.
*/
wire [base+15:base] wcd_big_l;
wire [base:base+15] wcd_ltl_l;
assign wcd_big_l[(base+3)-:4] = 4'd3;
assign wcd_big_l[(base+7)-:4] = 4'd2;
assign wcd_big_l[(base+11)-:4] = 4'd1;
assign wcd_big_l[(base+15)-:4] = 4'd0;
assign wcd_ltl_l[(base+3)-:4] = 4'd3;
assign wcd_ltl_l[(base+7)-:4] = 4'd2;
assign wcd_ltl_l[(base+11)-:4] = 4'd1;
assign wcd_ltl_l[(base+15)-:4] = 4'd0;
/*
* Check a constant +: and -: with a 'bx index as a CA L-value.
*/
wire [base+15:base] wcu_big_lx;
wire [base:base+15] wcu_ltl_lx;
wire [base+15:base] wcd_big_lx;
wire [base:base+15] wcd_ltl_lx;
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
assign wcu_big_lx[(1'bx)+:4] = 4'hf;
assign wcu_ltl_lx[(1'bx)+:4] = 4'hf;
assign wcd_big_lx[(1'bx)-:4] = 4'hf;
assign wcd_ltl_lx[(1'bx)-:4] = 4'hf;
`endif
/*
* Check a constant +: and -: with out of bounds values as a CA L-value.
*/
wire [base+15:base] wcu_big_lo;
wire [base:base+15] wcu_ltl_lo;
wire [base+15:base] wcd_big_lo;
wire [base:base+15] wcd_ltl_lo;
// For now Icarus does not support before base selects in a CA L-value.
// This test needs to be updated when this is added.
// assign wcu_big_lo[(base-1)+:4] = 4'b011x;
assign wcu_big_lo[(base)+:3] = 3'b011;
assign wcu_big_lo[(base+3)+:10] = 10'b0;
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
assign wcu_big_lo[(base+13)+:4] = 4'bx001;
assign wcu_ltl_lo[(base-1)+:4] = 4'bx001;
`else
assign wcu_big_lo[(base+13)+:3] = 3'b001;
assign wcu_ltl_lo[(base)+:3] = 3'b001;
`endif
assign wcu_ltl_lo[(base+3)+:10] = 10'b0;
assign wcu_ltl_lo[(base+13)+:3] = 3'b011;
// assign wcu_ltl_lo[(base+13)+:4] = 4'b011x;
// assign wcd_big_lo[(base+2)-:4] = 4'b011x;
assign wcd_big_lo[(base+2)-:3] = 3'b011;
assign wcd_big_lo[(base+12)-:10] = 10'b0;
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
assign wcd_big_lo[(base+16)-:4] = 4'bx001;
assign wcd_ltl_lo[(base+2)-:4] = 4'bx001;
`else
assign wcd_big_lo[(base+15)-:3] = 3'b001;
assign wcd_ltl_lo[(base+2)-:3] = 3'b001;
`endif
assign wcd_ltl_lo[(base+12)-:10] = 10'b0;
assign wcd_ltl_lo[(base+15)-:3] = 3'b011;
// assign wcd_ltl_lo[(base+16)-:4] = 4'b011x;
initial begin
pass = 1'b1;
#1;
$displayh("p_big/big: %h, p_ltl/ltl: %h, base: %0d", p_big, p_ltl, base);
/*
* Check a constant +: on a parameter.
*/
$display();
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("p_big[%0d+:4]: ", base-1, p_big[(base-1)+:4],
", p_ltl[%0d+:4]: ", base-1, p_ltl[(base-1)+:4]);
`else
$displayb("p_big[%0d+:4]: ", base-1, {p_big[(base)+:3],1'bx},
", p_ltl[%0d+:4]: ", base-1, {1'bx,p_ltl[(base)+:3]});
`endif
$displayh("p_big[%0d+:4]: ", base, p_big[(base)+:4],
", p_ltl[%0d+:4]: ", base, p_ltl[(base)+:4]);
$displayh("p_big[%0d+:4]: ", base+4, p_big[(base+4)+:4],
", p_ltl[%0d+:4]: ", base+4, p_ltl[(base+4)+:4]);
$displayh("p_big[%0d+:4]: ", base+8, p_big[(base+8)+:4],
", p_ltl[%0d+:4]: ", base+8, p_ltl[(base+8)+:4]);
$displayh("p_big[%0d+:4]: ", base+12, p_big[(base+12)+:4],
", p_ltl[%0d+:4]: ", base+12, p_ltl[(base+12)+:4]);
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("p_big[%0d+:4]: ", base+13, p_big[(base+13)+:4],
", p_ltl[%0d+:4]: ", base+13, p_ltl[(base+13)+:4]);
$displayb("p_big[%0d+:4]: ", 1'bx, p_big[(1'bx)+:4],
", p_ltl[%0d+:4]: ", 1'bx, p_ltl[(1'bx)+:4]);
`else
$displayb("p_big[%0d+:4]: ", base+13, {1'bx,p_big[(base+13)+:3]},
", p_ltl[%0d+:4]: ", base+13, {p_ltl[(base+13)+:3],1'bx});
$displayb("p_big[%0d+:4]: ", 1'bx, 4'bxxxx,
", p_ltl[%0d+:4]: ", 1'bx, 4'bxxxx);
`endif
if (p_big[ (base) +: 4] !== 4'd3 || p_big[ (base+4) +: 4] !== 4'd2 ||
p_big[(base+8) +: 4] !== 4'd1 || p_big[(base+12) +: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
p_big[ (base-1) +: 4] !== 4'b011x ||
p_big[(base+13) +: 4] !== 4'bx000 ||
p_big[(1'bx) +: 4] !== 4'bxxxx) begin
`else
{p_big[ (base) +: 3],1'bx} !== 4'b011x ||
{1'bx,p_big[(base+13) +: 3]} !== 4'bx000 ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: big endian parameter constant +: indexed select.");
pass = 1'b0;
end
if (p_ltl[ (base) +: 4] !== 4'd3 || p_ltl[ (base+4) +: 4] !== 4'd2 ||
p_ltl[(base+8) +: 4] !== 4'd1 || p_ltl[(base+12) +: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
p_ltl[ (base-1) +: 4] !== 4'bx001 ||
p_ltl[(base+13) +: 4] !== 4'b000x ||
p_ltl[(1'bx) +: 4] !== 4'bxxxx) begin
`else
{1'bx,p_ltl[ (base) +: 3]} !== 4'bx001 ||
{p_ltl[(base+13) +: 3],1'bx} !== 4'b000x ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: little endian parameter constant +: indexed select.");
pass = 1'b0;
end
/*
* Check a constant -: on a parameter.
*/
$display();
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("p_big[%0d-:4]: ", base+2, p_big[(base+2)-:4],
", p_ltl[%0d-:4]: ", base+2, p_ltl[(base+2)-:4]);
`else
$displayb("p_big[%0d-:4]: ", base+2, {p_big[(base+2)-:3],1'bx},
", p_ltl[%0d-:4]: ", base+2, {1'bx,p_ltl[(base+2)-:3]});
`endif
$displayh("p_big[%0d-:4]: ", base+3, p_big[(base+3)-:4],
", p_ltl[%0d-:4]: ", base+3, p_ltl[(base+3)-:4]);
$displayh("p_big[%0d-:4]: ", base+7, p_big[(base+7)-:4],
", p_ltl[%0d-:4]: ", base+7, p_ltl[(base+7)-:4]);
$displayh("p_big[%0d-:4]: ", base+11, p_big[(base+11)-:4],
", p_ltl[%0d-:4]: ", base+11, p_ltl[(base+11)-:4]);
$displayh("p_big[%0d-:4]: ", base+15, p_big[(base+15)-:4],
", p_ltl[%0d-:4]: ", base+15, p_ltl[(base+15)-:4]);
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("p_big[%0d-:4]: ", base+16, p_big[(base+16)-:4],
", p_ltl[%0d-:4]: ", base+16, p_ltl[(base+16)-:4]);
$displayb("p_big[%0d-:4]: ", 1'bx, p_big[(1'bx)-:4],
", p_ltl[%0d-:4]: ", 1'bx, p_ltl[(1'bx)-:4]);
`else
$displayb("p_big[%0d-:4]: ", base+16, {1'bx,p_big[(base+15)-:3]},
", p_ltl[%0d-:4]: ", base+16, {p_ltl[(base+15)-:3],1'bx});
$displayb("p_big[%0d-:4]: ", 1'bx, 4'bxxxx,
", p_ltl[%0d-:4]: ", 1'bx, 4'bxxxx);
`endif
if (p_big[ (base+3) -: 4] !== 4'd3 || p_big[ (base+7) -: 4] !== 4'd2 ||
p_big[(base+11) -: 4] !== 4'd1 || p_big[(base+15) -: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
p_big[ (base+2) -: 4] !== 4'b011x ||
p_big[(base+16) -: 4] !== 4'bx000 ||
p_big[(1'bx) -: 4] !== 4'bxxxx) begin
`else
{p_big[ (base+2) -: 3],1'bx} !== 4'b011x ||
{1'bx,p_big[(base+15) -: 3]} !== 4'bx000 ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: big endian parameter constant -: indexed select.");
pass = 1'b0;
end
if (p_ltl[ (base+3) -: 4] !== 4'd3 || p_ltl[ (base+7) -: 4] !== 4'd2 ||
p_ltl[(base+11) -: 4] !== 4'd1 || p_ltl[(base+15) -: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
p_ltl[ (base+2) -: 4] !== 4'bx001 ||
p_ltl[(base+16) -: 4] !== 4'b000x ||
p_ltl[(1'bx) -: 4] !== 4'bxxxx) begin
`else
{1'bx,p_ltl[ (base+2) -: 3]} !== 4'bx001 ||
{p_ltl[(base+15) -: 3],1'bx} !== 4'b000x ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: little endian parameter constant -: indexed select.");
pass = 1'b0;
end
/*
* Check a constant +: on a parameter with out a width specification.
*/
$display();
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("p_base[-1+:4]: ", p_base[-1+:4]);
`else
$displayb("p_base[-1+:4]: ", {p_base[0+:3],1'bx});
`endif
$displayh("p_base[0+:4]: ", p_base[0+:4]);
$displayh("p_base[4+:4]: ", p_base[4+:4]);
$displayh("p_base[8+:4]: ", p_base[8+:4]);
$displayh("p_base[12+:4]: ", p_base[12+:4]);
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("p_base[13+:4]: ", p_base[13+:4]);
$displayb("p_base[x+:4]: ", p_base[(1'bx)+:4]);
`else
$displayb("p_base[13+:4]: ", {1'bx,p_base[13+:3]});
$displayb("p_base[x+:4]: ", 4'bxxxx);
`endif
if (p_base[ 0 +: 4] !== 4'd3 || p_base[ 4 +: 4] !== 4'd2 ||
p_base[ 8 +: 4] !== 4'd1 || p_base[12 +: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
p_base[-1 +: 4] !== 4'b011x || p_base[13 +: 4] !== 4'bx000 ||
p_base[1'bx +: 4] !== 4'bxxxx) begin
`else
{p_base[0 +: 3],1'bx} !== 4'b011x ||
{1'bx,p_base[13 +: 3]} !== 4'bx000 ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: base parameter constant +: indexed select.");
pass = 1'b0;
end
/*
* Check a constant -: on a parameter with out a width specification.
*/
$display();
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("p_base[2-:4]: ", p_base[2-:4]);
`else
$displayb("p_base[2-:4]: ", {p_base[2-:3],1'bx});
`endif
$displayh("p_base[3-:4]: ", p_base[3-:4]);
$displayh("p_base[7-:4]: ", p_base[7-:4]);
$displayh("p_base[11-:4]: ", p_base[11-:4]);
$displayh("p_base[15-:4]: ", p_base[15-:4]);
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("p_base[16-:4]: ", p_base[16-:4]);
$displayb("p_base[x-:4]: ", p_base[(1'bx)-:4]);
`else
$displayb("p_base[16-:4]: ", {1'bx,p_base[15-:3]});
$displayb("p_base[x-:4]: ", 4'bxxxx);
`endif
if (p_base[ 3 -: 4] !== 4'd3 || p_base[ 7 -: 4] !== 4'd2 ||
p_base[11 -: 4] !== 4'd1 || p_base[15 -: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
p_base[ 2 -: 4] !== 4'b011x || p_base[16 -: 4] !== 4'bx000 ||
p_base[(1'bx) -: 4] !== 4'bxxxx) begin
`else
{p_base[ 2 -: 3],1'bx} !== 4'b011x ||
{1'bx,p_base[15 -: 3]} !== 4'bx000 ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: base parameter constant -: indexed select.");
pass = 1'b0;
end
/*
* Check a constant +: on a register.
*/
$display();
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("big[%0d+:4]: ", base-1, big[(base-1)+:4],
", ltl[%0d+:4]: ", base-1, ltl[(base-1)+:4]);
`else
$displayb("big[%0d+:4]: ", base-1, {big[(base)+:3],1'bx},
", ltl[%0d+:4]: ", base-1, {1'bx,ltl[(base)+:3]});
`endif
$displayh("big[%0d+:4]: ", base, big[(base)+:4],
", ltl[%0d+:4]: ", base, ltl[(base)+:4]);
$displayh("big[%0d+:4]: ", base+4, big[(base+4)+:4],
", ltl[%0d+:4]: ", base+4, ltl[(base+4)+:4]);
$displayh("big[%0d+:4]: ", base+8, big[(base+8)+:4],
", ltl[%0d+:4]: ", base+8, ltl[(base+8)+:4]);
$displayh("big[%0d+:4]: ",base+12, big[(base+12)+:4],
", ltl[%0d+:4]: ",base+12, ltl[(base+12)+:4]);
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("big[%0d+:4]: ",base+13, big[(base+13)+:4],
", ltl[%0d+:4]: ",base+13, ltl[(base+13)+:4]);
$displayb("big[%0d+:4]: ",1'bx, big[(1'bx)+:4],
", ltl[%0d+:4]: ",1'bx, ltl[(1'bx)+:4]);
`else
$displayb("big[%0d+:4]: ",base+13, {1'bx,big[(base+13)+:3]},
", ltl[%0d+:4]: ",base+13, {ltl[(base+13)+:3],1'bx});
$displayb("big[%0d+:4]: ",1'bx, 4'bxxxx,
", ltl[%0d+:4]: ",1'bx, 4'bxxxx);
`endif
if (big[ (base) +: 4] !== 4'd3 || big[ (base+4) +: 4] !== 4'd2 ||
big[(base+8) +: 4] !== 4'd1 || big[(base+12) +: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
big[ (base-1) +: 4] !== 4'b011x ||
big[(base+13) +: 4] !== 4'bx000 ||
big[(1'bx) +: 4] !== 4'bxxxx) begin
`else
{big[ (base) +: 3],1'bx} !== 4'b011x ||
{1'bx,big[(base+13) +: 3]} !== 4'bx000 ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: big endian register constant +: indexed select.");
pass = 1'b0;
end
if (ltl[ (base) +: 4] !== 4'd3 || ltl[ (base+4) +: 4] !== 4'd2 ||
ltl[(base+8) +: 4] !== 4'd1 || ltl[(base+12) +: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
ltl[ (base-1) +: 4] !== 4'bx001 ||
ltl[(base+13) +: 4] !== 4'b000x ||
ltl[(1'bx) +: 4] !== 4'bxxxx) begin
`else
{1'bx,ltl[ (base) +: 3]} !== 4'bx001 ||
{ltl[(base+13) +: 3],1'bx} !== 4'b000x ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: little endian register constant +: indexed select.");
pass = 1'b0;
end
/*
* Check a constant -: on a register.
*/
$display();
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("big[%0d-:4]: ", base+2, big[(base+2)-:4],
", ltl[%0d-:4]: ", base+2, ltl[(base+2)-:4]);
`else
$displayb("big[%0d-:4]: ", base+2, {big[(base+2)-:3],1'bx},
", ltl[%0d-:4]: ", base+2, {1'bx,ltl[(base+2)-:3]});
`endif
$displayh("big[%0d-:4]: ", base+3, big[(base+3)-:4],
", ltl[%0d-:4]: ", base+3, ltl[(base+3)-:4]);
$displayh("big[%0d-:4]: ", base+7, big[(base+7)-:4],
", ltl[%0d-:4]: ", base+7, ltl[(base+7)-:4]);
$displayh("big[%0d-:4]: ", base+11, big[(base+11)-:4],
", ltl[%0d-:4]: ", base+11, ltl[(base+11)-:4]);
$displayh("big[%0d-:4]: ", base+15, big[(base+15)-:4],
", ltl[%0d-:4]: ", base+15, ltl[(base+15)-:4]);
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("big[%0d-:4]: ", base+16, big[(base+16)-:4],
", ltl[%0d-:4]: ", base+16, ltl[(base+16)-:4]);
$displayb("big[%0d-:4]: ", 1'bx, big[(1'bx)-:4],
", ltl[%0d-:4]: ", 1'bx, ltl[(1'bx)-:4]);
`else
$displayb("big[%0d-:4]: ", base+16, {1'bx,big[(base+15)-:3]},
", ltl[%0d-:4]: ", base+16, {ltl[(base+15)-:3],1'bx});
$displayb("big[%0d-:4]: ", 1'bx, 4'bxxxx,
", ltl[%0d-:4]: ", 1'bx, 4'bxxxx);
`endif
if (big[ (base+3) -: 4] !== 4'd3 || big[ (base+7) -: 4] !== 4'd2 ||
big[(base+11) -: 4] !== 4'd1 || big[(base+15) -: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
big[ (base+2) -: 4] !== 4'b011x ||
big[(base+16) -: 4] !== 4'bx000 ||
big[(1'bx) -: 4] !== 4'bxxxx) begin
`else
{big[ (base+2) -: 3],1'bx} !== 4'b011x ||
{1'bx,big[(base+15) -: 3]} !== 4'bx000 ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: big endian register constant -: indexed select.");
pass = 1'b0;
end
if (ltl[ (base+3) -: 4] !== 4'd3 || ltl[ (base+7) -: 4] !== 4'd2 ||
ltl[(base+11) -: 4] !== 4'd1 || ltl[(base+15) -: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
ltl[ (base+2) -: 4] !== 4'bx001 ||
ltl[(base+16) -: 4] !== 4'b000x ||
ltl[(1'bx) -: 4] !== 4'bxxxx) begin
`else
{1'bx,ltl[ (base+2) -: 3]} !== 4'bx001 ||
{ltl[(base+15) -: 3],1'bx} !== 4'b000x ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: little endian register constant -: indexed select.");
pass = 1'b0;
end
/*
* Check a constant +: on a wire.
*/
$display();
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("w_big[%0d+:4]: ", base-1, w_big[(base-1)+:4],
", w_ltl[%0d+:4]: ", base-1, w_ltl[(base-1)+:4]);
`else
$displayb("w_big[%0d+:4]: ", base-1, {w_big[(base)+:3],1'bx},
", w_ltl[%0d+:4]: ", base-1, {1'bx,w_ltl[(base)+:3]});
`endif
$displayh("w_big[%0d+:4]: ", base, w_big[(base)+:4],
", w_ltl[%0d+:4]: ", base, w_ltl[(base)+:4]);
$displayh("w_big[%0d+:4]: ", base+4, w_big[(base+4)+:4],
", w_ltl[%0d+:4]: ", base+4, w_ltl[(base+4)+:4]);
$displayh("w_big[%0d+:4]: ", base+8, w_big[(base+8)+:4],
", w_ltl[%0d+:4]: ", base+8, w_ltl[(base+8)+:4]);
$displayh("w_big[%0d+:4]: ", base+12, w_big[(base+12)+:4],
", w_ltl[%0d+:4]: ", base+12, w_ltl[(base+12)+:4]);
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("w_big[%0d+:4]: ", base+13, w_big[(base+13)+:4],
", w_ltl[%0d+:4]: ", base+13, w_ltl[(base+13)+:4]);
$displayb("w_big[%0d+:4]: ", 1'bx, w_big[(1'bx)+:4],
", w_ltl[%0d+:4]: ", 1'bx, w_ltl[(1'bx)+:4]);
`else
$displayb("w_big[%0d+:4]: ", base+13, {1'bx,w_big[(base+13)+:3]},
", w_ltl[%0d+:4]: ", base+13, {w_ltl[(base+13)+:3],1'bx});
$displayb("w_big[%0d+:4]: ", 1'bx, 4'bxxxx,
", w_ltl[%0d+:4]: ", 1'bx, 4'bxxxx);
`endif
if (w_big[ (base) +: 4] !== 4'd3 || w_big[ (base+4) +: 4] !== 4'd2 ||
w_big[(base+8) +: 4] !== 4'd1 || w_big[(base+12) +: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
w_big[ (base-1) +: 4] !== 4'b011x ||
w_big[(base+13) +: 4] !== 4'bx000 ||
w_big[(1'bx) +: 4] !== 4'bxxxx) begin
`else
{w_big[ (base) +: 3],1'bx} !== 4'b011x ||
{1'bx,w_big[(base+13) +: 3]} !== 4'bx000 ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: big endian wire constant +: indexed select.");
pass = 1'b0;
end
if (w_ltl[ (base) +: 4] !== 4'd3 || w_ltl[ (base+4) +: 4] !== 4'd2 ||
w_ltl[(base+8) +: 4] !== 4'd1 || w_ltl[(base+12) +: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
w_ltl[ (base-1) +: 4] !== 4'bx001 ||
w_ltl[(base+13) +: 4] !== 4'b000x ||
w_ltl[(1'bx) +: 4] !== 4'bxxxx) begin
`else
{1'bx,w_ltl[ (base) +: 3]} !== 4'bx001 ||
{w_ltl[(base+13) +: 3],1'bx} !== 4'b000x ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: little endian wire constant +: indexed select.");
pass = 1'b0;
end
/*
* Check a constant -: on a wire.
*/
$display();
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("w_big[%0d-:4]: ", base+2, w_big[(base+2)-:4],
", w_ltl[%0d-:4]: ", base+2, w_ltl[(base+2)-:4]);
`else
$displayb("w_big[%0d-:4]: ", base+2, {w_big[(base+2)-:3],1'bx},
", w_ltl[%0d-:4]: ", base+2, {1'bx,w_ltl[(base+2)-:3]});
`endif
$displayh("w_big[%0d-:4]: ", base+3, w_big[(base+3)-:4],
", w_ltl[%0d-:4]: ", base+3, w_ltl[(base+3)-:4]);
$displayh("w_big[%0d-:4]: ", base+7, w_big[(base+7)-:4],
", w_ltl[%0d-:4]: ", base+7, w_ltl[(base+7)-:4]);
$displayh("w_big[%0d-:4]: ", base+11, w_big[(base+11)-:4],
", w_ltl[%0d-:4]: ", base+11, w_ltl[(base+11)-:4]);
$displayh("w_big[%0d-:4]: ", base+15, w_big[(base+15)-:4],
", w_ltl[%0d-:4]: ", base+15, w_ltl[(base+15)-:4]);
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
$displayb("w_big[%0d-:4]: ", base+16, w_big[(base+16)-:4],
", w_ltl[%0d-:4]: ", base+16, w_ltl[(base+16)-:4]);
$displayb("w_big[%0d-:4]: ", 1'bx, w_big[(1'bx)-:4],
", w_ltl[%0d-:4]: ", 1'bx, w_ltl[(1'bx)-:4]);
`else
$displayb("w_big[%0d-:4]: ", base+16, {1'bx,w_big[(base+15)-:3]},
", w_ltl[%0d-:4]: ", base+16, {w_ltl[(base+15)-:3],1'bx});
$displayb("w_big[%0d-:4]: ", 1'bx, 4'bxxxx,
", w_ltl[%0d-:4]: ", 1'bx, 4'bxxxx);
`endif
if (w_big[ (base+3) -: 4] !== 4'd3 || w_big[ (base+7) -: 4] !== 4'd2 ||
w_big[(base+11) -: 4] !== 4'd1 || w_big[(base+15) -: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
w_big[ (base+2) -: 4] !== 4'b011x ||
w_big[(base+16) -: 4] !== 4'bx000 ||
w_big[(1'bx) -: 4] !== 4'bxxxx) begin
`else
{w_big[ (base+2) -: 3],1'bx} !== 4'b011x ||
{1'bx,w_big[(base+15) -: 3]} !== 4'bx000 ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: big endian wire constant -: indexed select.");
pass = 1'b0;
end
if (w_ltl[ (base+3) -: 4] !== 4'd3 || w_ltl[ (base+7) -: 4] !== 4'd2 ||
w_ltl[(base+11) -: 4] !== 4'd1 || w_ltl[(base+15) -: 4] !== 4'd0 ||
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
w_ltl[ (base+2) -: 4] !== 4'bx001 ||
w_ltl[(base+16) -: 4] !== 4'b000x ||
w_ltl[(1'bx) -: 4] !== 4'bxxxx) begin
`else
{1'bx,w_ltl[ (base+2) -: 3]} !== 4'bx001 ||
{w_ltl[(base+15) -: 3],1'bx} !== 4'b000x ||
4'bxxxx !== 4'bxxxx) begin
`endif
$display("FAILED: little endian wire constant -: indexed select.");
pass = 1'b0;
end
/*
* Check a constant +: on a CA R-value.
*/
$display();
$displayb("wcu_big3a: ", wcu_big3a, ", wcu_ltl3a: ", wcu_ltl3a);
$displayh("wcu_big3: ", wcu_big3, ", wcu_ltl3: ", wcu_ltl3);
$displayh("wcu_big2: ", wcu_big2, ", wcu_ltl2: ", wcu_ltl2);
$displayh("wcu_big1: ", wcu_big1, ", wcu_ltl1: ", wcu_ltl1);
$displayh("wcu_big0: ", wcu_big0, ", wcu_ltl0: ", wcu_ltl0);
$displayb("wcu_big0a: ", wcu_big0a, ", wcu_ltl0a: ", wcu_ltl0a);
$displayb("wcu_bigx: ", wcu_bigx, ", wcu_ltlx: ", wcu_ltlx);
if (wcu_big3 !== 4'd3 || wcu_big2 !== 4'd2 ||
wcu_big1 !== 4'd1 || wcu_big0 !== 4'd0 ||
wcu_big3a !== 4'b011x || wcu_big0a !== 4'bx000 ||
wcu_bigx !== 4'bxxxx) begin
$display("FAILED: big endian CA R-value constant +: indexed select.");
pass = 1'b0;
end
if (wcu_ltl3 !== 4'd3 || wcu_ltl2 !== 4'd2 ||
wcu_ltl1 !== 4'd1 || wcu_ltl0 !== 4'd0 ||
wcu_ltl3a !== 4'bx001 || wcu_ltl0a !== 4'b000x ||
wcu_ltlx !== 4'bxxxx) begin
$display("FAILED: little endian CA R-value constant +: indexed select.");
pass = 1'b0;
end
/*
* Check a constant -: on a CA R-value.
*/
$display();
$displayb("wcd_big3a: ", wcd_big3a, ", wcd_ltl3a: ", wcd_ltl3a);
$displayh("wcd_big3: ", wcd_big3, ", wcd_ltl3: ", wcd_ltl3);
$displayh("wcd_big2: ", wcd_big2, ", wcd_ltl2: ", wcd_ltl2);
$displayh("wcd_big1: ", wcd_big1, ", wcd_ltl1: ", wcd_ltl1);
$displayh("wcd_big0: ", wcd_big0, ", wcd_ltl0: ", wcd_ltl0);
$displayb("wcd_big0a: ", wcd_big0a, ", wcd_ltl0a: ", wcd_ltl0a);
$displayb("wcd_bigx: ", wcd_bigx, ", wcd_ltlx: ", wcd_ltlx);
if (wcd_big3 !== 4'd3 || wcd_big2 !== 4'd2 ||
wcd_big1 !== 4'd1 || wcd_big0 !== 4'd0 ||
wcd_big3a !== 4'b011x || wcd_big0a !== 4'bx000 ||
wcd_bigx !== 4'bxxxx) begin
$display("FAILED: big endian CA R-value constant -: indexed select.");
pass = 1'b0;
end
if (wcd_ltl3 !== 4'd3 || wcd_ltl2 !== 4'd2 ||
wcd_ltl1 !== 4'd1 || wcd_ltl0 !== 4'd0 ||
wcd_ltl3a !== 4'bx001 || wcd_ltl0a !== 4'b000x ||
wcd_ltlx !== 4'bxxxx) begin
$display("FAILED: little endian CA R-value constant -: indexed select.");
pass = 1'b0;
end
/*
* Check a constant +: on a simple L-value.
*/
$display();
big_l = 16'hxxxx;
ltl_l = 16'hxxxx;
big_l[(base)+:4] = 4'd3;
ltl_l[(base)+:4] = 4'd3;
big_l[(base+4)+:4] = 4'd2;
ltl_l[(base+4)+:4] = 4'd2;
big_l[(base+8)+:4] = 4'd1;
ltl_l[(base+8)+:4] = 4'd1;
big_l[(base+12)+:4] = 4'd0;
ltl_l[(base+12)+:4] = 4'd0;
$displayh("big_l[simple]: ", big_l, ", ltl_l[simple]: ", ltl_l);
if (big_l !== big) begin
$display("FAILED: big endian simple L-value constant +: indexed select.");
pass = 1'b0;
end
if (ltl_l !== ltl) begin
$display("FAILED: little endian simple L-value constant +: indexed select.");
pass = 1'b0;
end
big_l = 16'hxxxx;
ltl_l = 16'hxxxx;
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
big_l[(1'bx)+:4] = 4'd0;
ltl_l[(1'bx)+:4] = 4'd0;
`endif
$displayh("big_l[1'bx]: ", big_l, ", ltl_l[1'bx]: ", ltl_l);
if (big_l !== 16'hxxxx) begin
$display("FAILED: big endian L-value constant 'bx index +: indexed select.");
pass = 1'b0;
end
if (ltl_l !== 16'hxxxx) begin
$display("FAILED: little endian L-value constant 'bx index +: indexed select.");
pass = 1'b0;
end
big_l = 16'h0000;
ltl_l = 16'h0000;
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
big_l[(base-1)+:4] = 4'b011x;
ltl_l[(base-1)+:4] = 4'bx001;
big_l[(base+13)+:4] = 4'bx001;
ltl_l[(base+13)+:4] = 4'b011x;
`else
big_l[(base)+:3] = 3'b011;
ltl_l[(base)+:3] = 3'b001;
big_l[(base+13)+:3] = 3'b001;
ltl_l[(base+13)+:3] = 3'b011;
`endif
$displayh("big_l[edge]: ", big_l, ", ltl_l[edge]: ", ltl_l);
if (big_l !== 16'h2003) begin
$display("FAILED: big endian edge L-value constant +: indexed select.");
pass = 1'b0;
end
if (ltl_l !== 16'h2003) begin
$display("FAILED: little endian edge L-value constant +: indexed select.");
pass = 1'b0;
end
/*
* Check a constant -: on a simple L-value.
*/
$display();
big_l = 16'hxxxx;
ltl_l = 16'hxxxx;
big_l[(base+3)-:4] = 4'd3;
ltl_l[(base+3)-:4] = 4'd3;
big_l[(base+7)-:4] = 4'd2;
ltl_l[(base+7)-:4] = 4'd2;
big_l[(base+11)-:4] = 4'd1;
ltl_l[(base+11)-:4] = 4'd1;
big_l[(base+15)-:4] = 4'd0;
ltl_l[(base+15)-:4] = 4'd0;
$displayh("big_l: ", big_l, ", ltl_l: ", ltl_l);
if (big_l !== big) begin
$display("FAILED: big endian simple L-value constant -: indexed select.");
pass = 1'b0;
end
if (ltl_l !== ltl) begin
$display("FAILED: little endian simple L-value constant -: indexed select.");
pass = 1'b0;
end
big_l = 16'hxxxx;
ltl_l = 16'hxxxx;
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
big_l[(1'bx)-:4] = 4'd0;
ltl_l[(1'bx)-:4] = 4'd0;
`endif
$displayh("big_l[1'bx]: ", big_l, ", ltl_l[1'bx]: ", ltl_l);
if (big_l !== 16'hxxxx) begin
$display("FAILED: big endian L-value constant 'bx index -: indexed select.");
pass = 1'b0;
end
if (ltl_l !== 16'hxxxx) begin
$display("FAILED: little endian L-value constant 'bx index -: indexed select.");
pass = 1'b0;
end
big_l = 16'h0000;
ltl_l = 16'h0000;
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
big_l[(base+2)-:4] = 4'b011x;
ltl_l[(base+2)-:4] = 4'bx001;
big_l[(base+16)-:4] = 4'bx001;
ltl_l[(base+16)-:4] = 4'b011x;
`else
big_l[(base+2)-:3] = 3'b011;
ltl_l[(base+2)-:3] = 3'b001;
big_l[(base+15)-:3] = 3'b001;
ltl_l[(base+15)-:3] = 3'b011;
`endif
$displayh("big_l[edge]: ", big_l, ", ltl_l[edge]: ", ltl_l);
if (big_l !== 16'h2003) begin
$display("FAILED: big endian edge L-value constant -: indexed select.");
pass = 1'b0;
end
if (ltl_l !== 16'h2003) begin
$display("FAILED: little endian edge L-value constant -: indexed select.");
pass = 1'b0;
end
/*
* Check a constant +: on a CA L-value.
*/
$display();
$displayh("wcu_big_l: ", wcu_big_l, ", wcu_ltl_l: ", wcu_ltl_l);
if (wcu_big_l !== big) begin
$display("FAILED: big endian CA L-value constant +: indexed select.");
pass = 1'b0;
end
if (wcu_ltl_l !== ltl) begin
$display("FAILED: little endian CA L-value constant +: indexed select.");
pass = 1'b0;
end
$displayh("wcu_big_lx: ", wcu_big_lx, ", wcu_ltl_lx: ", wcu_ltl_lx);
if (wcu_big_lx !== 16'hzzzz) begin
$display("FAILED: big endian CA L-value constant 'bx +: indexed select.");
pass = 1'b0;
end
if (wcu_ltl_lx !== 16'hzzzz) begin
$display("FAILED: little endian CA L-value constant 'bx +: indexed select.");
pass = 1'b0;
end
$displayh("wcu_big_lo: ", wcu_big_lo, ", wcu_ltl_lo: ", wcu_ltl_lo);
if (wcu_big_lo !== 16'h2003) begin
$display("FAILED: big endian edge CA L-value constant +: indexed select.");
pass = 1'b0;
end
if (wcu_ltl_lo !== 16'h2003) begin
$display("FAILED: little endian edge CA L-value constant +: indexed select.");
pass = 1'b0;
end
/*
* Check a constant -: on a CA L-value.
*/
$display();
$displayh("wcd_big_l: ", wcd_big_l, ", wcd_ltl_l: ", wcd_ltl_l);
if (wcd_big_l !== big) begin
$display("FAILED: big endian CA L-value constant -: indexed select.");
pass = 1'b0;
end
if (wcd_ltl_l !== ltl) begin
$display("FAILED: little endian CA L-value constant -: indexed select.");
pass = 1'b0;
end
$displayh("wcd_big_lx: ", wcd_big_lx, ", wcd_ltl_lx: ", wcd_ltl_lx);
if (wcd_big_lx !== 16'hzzzz) begin
$display("FAILED: big endian CA L-value constant 'bx -: indexed select.");
pass = 1'b0;
end
if (wcd_ltl_lx !== 16'hzzzz) begin
$display("FAILED: little endian CA L-value constant 'bx -: indexed select.");
pass = 1'b0;
end
$displayh("wcd_big_lo: ", wcd_big_lo, ", wcd_ltl_lo: ", wcd_ltl_lo);
if (wcd_big_lo !== 16'h2003) begin
$display("FAILED: big endian edge CA L-value constant -: indexed select.");
pass = 1'b0;
end
if (wcd_ltl_lo !== 16'h2003) begin
$display("FAILED: little endian edge CA L-value constant -: indexed select.");
pass = 1'b0;
end
/*
* All done.
*/
if (pass) $display("PASSED");
end
endmodule