module top; // We expect bits for the zero or mone parameters. The // big test must also be at least , but Icarus currently // creates 48 bits. I personally think this is the correct behavior. parameter zero = 0; parameter mone = -1; parameter big = 'hffffffffffff; parameter max = 2**16; // We will call this many bits unlimited. reg pass; integer idx; initial begin pass = 1'b1; /* * Check with a bit select. */ $display("Checking the size with a bit select."); $display("------------------------------------"); // Test to see how far a decimal 0 is extended. begin: loop_zero for (idx = 0; idx < max; idx = idx + 1) begin if (zero[idx] !== 0) disable loop_zero; end end if (idx != max) begin $display("The size of a decimal 0 parameter is %0d bits.", idx); // Check that after the parameter is 1'bx. if (zero[idx] !== 1'bx) begin $display(" Failed: after bit must be 1'bx, got %b.", zero[idx]); pass = 1'b0; end end else begin $display("The size of a decimal 0 parameter is unlimited."); end // An unsized parameter must be at least 32 bits. if (idx < 32) begin $display(" Failed: unsized parameter must be >= 32 bits, got %0d.", idx); pass = 1'b0; end // Check that before the parameter is 1'bx. idx = -1; if (zero[idx] !== 1'bx) begin $display(" Failed: before bit must be 1'bx, got %b.", zero[idx]); pass = 1'b0; end // Check that an undefined index gives 1'bx. idx = 'bx; if (zero[idx] !== 1'bx) begin $display(" Failed: undefined select must be 1'bx, got %b.", zero[idx]); pass = 1'b0; end // Test to see how far a decimal -1 is extended. begin: loop_mone for (idx = 0; idx < max; idx = idx + 1) begin if (mone[idx] !== 1) disable loop_mone; end end if (idx != max) begin $display("The size of a decimal -1 parameter is %0d bits.", idx); // Check that after the parameter is 1'bx. if (mone[idx] !== 1'bx) begin $display(" Failed: after bit must be 1'bx, got %b", mone[idx]); pass = 1'b0; end end else begin $display("The size of a decimal -1 parameter is unlimited."); end // An unsized parameter must be at least 32 bits. if (idx < 32) begin $display(" Failed: unsized parameter must be >= 32 bits, got %0d.", idx); pass = 1'b0; end // Check that before the parameter is 1'bx. idx = -1; if (mone[idx] !== 1'bx) begin $display(" Failed: before bit must be 1'bx, got %b.", mone[idx]); pass = 1'b0; end // Check that an undefined index gives 1'bx. idx = 'bx; if (mone[idx] !== 1'bx) begin $display(" Failed: undefined select must be 1'bx, got %b.", mone[idx]); pass = 1'b0; end // Check to see if a parameter can be more than 32 bits (I expect // unlimited or 48 bits). If they exist the first 48 bits must be 1 // any remaining bits are 0. begin: loop_big for (idx = 0; idx < max; idx = idx + 1) begin if (big[idx] !== (idx < 48)) disable loop_big; end end if (idx != max) begin $display("The size of a big decimal parameter is %0d bits.", idx); // Check that after the parameter is 1'bx. if (big[idx] !== 1'bx) begin $display(" Failed: after bit must be 1'bx, got %b", big[idx]); pass = 1'b0; end end else begin $display("The size of a big decimal parameter is unlimited."); end // An unsized parameter must be at least 32 bits. if (idx < 48) begin $display(" Warning: 48 bit unsized parameter was truncated to %0d bits", idx); end if (idx < 32) begin $display(" Failed: unsized parameter must be >= 32 bits, got %0d.", idx); pass = 1'b0; end // Check that before the parameter is 1'bx. idx = -1; if (big[idx] !== 1'bx) begin $display(" Failed: before bit must be 1'bx, got %b.", big[idx]); pass = 1'b0; end // Check that an undefined index gives 1'bx. idx = 'bx; if (big[idx] !== 1'bx) begin $display(" Failed: undefined select must be 1'bx, got %b.", big[idx]); pass = 1'b0; end /* * Check with an indexed up select. */ $display(""); $display("Checking the size with an indexed part select."); $display("----------------------------------------------"); // Test to see how far a decimal 0 is extended. begin: loop_zero2 for (idx = 0; idx < max; idx = idx + 1) begin if (zero[idx+:1] !== 0) disable loop_zero2; end end if (idx != max) begin $display("The size of a decimal 0 parameter is %0d bits.", idx); // Check that after the parameter is 1'bx. if (zero[idx+:1] !== 1'bx) begin $display(" Failed: after bit must be 1'bx, got %b", zero[idx+:1]); pass = 1'b0; end end else begin $display("The size of a decimal 0 parameter is unlimited."); end // An unsized parameter must be at least 32 bits. if (idx < 32) begin $display(" Failed: unsized parameter must be >= 32 bits, got %0d.", idx); pass = 1'b0; end // Check that before the parameter is 1'bx. idx = -1; if (zero[idx+:1] !== 1'bx) begin $display(" Failed: before bit must be 1'bx, got %b.", zero[idx+:1]); pass = 1'b0; end // Check that an undefined index gives 1'bx. idx = 'bx; if (zero[idx+:1] !== 1'bx) begin $display(" Failed: undefined select must be 1'bx, got %b.", zero[idx+:1]); pass = 1'b0; end // Test to see how far a decimal -1 is extended. begin: loop_mone2 for (idx = 0; idx < max; idx = idx + 1) begin if (mone[idx+:1] !== 1) disable loop_mone2; end end if (idx != max) begin $display("The size of a decimal -1 parameter is %0d bits.", idx); // Check that after the parameter is 1'bx. if (mone[idx+:1] !== 1'bx) begin $display(" Failed: after bit must be 1'bx, got %b", mone[idx+:1]); pass = 1'b0; end end else begin $display("The size of a decimal -1 parameter is unlimited."); end // An unsized parameter must be at least 32 bits. if (idx < 32) begin $display(" Failed: unsized parameter must be >= 32 bits, got %0d.", idx); pass = 1'b0; end // Check that before the parameter is 1'bx. idx = -1; if (mone[idx+:1] !== 1'bx) begin $display(" Failed: before bit must be 1'bx, got %b.", mone[idx+:1]); pass = 1'b0; end // Check that an undefined index gives 1'bx. idx = 'bx; if (mone[idx+:1] !== 1'bx) begin $display(" Failed: undefined select must be 1'bx, got %b.", mone[idx+:1]); pass = 1'b0; end // Check to see if a parameter can be more than 32 bits (I expect // unlimited or 48 bits). If they exist the first 48 bits must be 1 // any remaining bits are 0. begin: loop_big2 for (idx = 0; idx < max; idx = idx + 1) begin if (big[idx+:1] !== (idx < 48)) disable loop_big2; end end if (idx != max) begin $display("The size of a big decimal parameter is %0d bits.", idx); // Check that after the parameter is 1'bx. if (big[idx+:1] !== 1'bx) begin $display("Failed: after bit must be 1'bx, got %b", big[idx+:1]); pass = 1'b0; end end else begin $display("The size of a big decimal parameter is unlimited."); end // An unsized parameter must be at least 32 bits. if (idx < 48) begin $display(" Warning: 48 bit unsized parameter was truncated to %0d bits", idx); end if (idx < 32) begin $display(" Failed: unsized parameter must be >= 32 bits, got %0d.", idx); pass = 1'b0; end // Check that before the parameter is 1'bx. idx = -1; if (big[idx+:1] !== 1'bx) begin $display(" Failed: before bit must be 1'bx, got %b.", big[idx+:1]); pass = 1'b0; end // Check that an undefined index gives 1'bx. idx = 'bx; if (big[idx+:1] !== 1'bx) begin $display(" Failed: undefined select must be 1'bx, got %b.", big[idx+:1]); pass = 1'b0; end if (pass) $display("PASSED"); end endmodule