1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
// This slightly convoluted module used to cause an argument-size
// mismatch in the call to the function extend_data
module test (c);
parameter MAX_SIZE = 32;
input c;
reg [MAX_SIZE-1:0] d,
e,
f;
reg [7:0] g;
wire h;
always @(posedge h or negedge c)
if (~c)
f <= #2 {MAX_SIZE{1'b0}};
else
case (g)
8'h18 :
f <= #2 hw(d, e);
default :
f <= #2 {MAX_SIZE{1'b0}};
endcase
parameter FALSE_RESULT = {MAX_SIZE{1'b0}},
TRUE_RESULT = FALSE_RESULT | 1'b1;
function integer sign_of;
input [2*MAX_SIZE-1:0] data;
input size;
reg [2*MAX_SIZE-1:0] data;
integer size;
if (data[size-1]===1'b1)
sign_of = -1;
else
sign_of = 1;
endfunction
function [2*MAX_SIZE-1:0] extend_data;
input [2*MAX_SIZE-1:0] data;
input size;
input new_size;
input extend;
reg [2*MAX_SIZE-1:0] data;
integer size,
new_size;
reg extend;
for (extend_data = data ; new_size-size>0 ; new_size=new_size-1)
extend_data[new_size-1] = extend & data[size-1];
endfunction
function [MAX_SIZE-1:0] hw;
input [MAX_SIZE-1:0] a;
input [MAX_SIZE-1:0] b;
reg [MAX_SIZE-1:0] a,
b;
reg [MAX_SIZE:0] diff;
begin
diff = extend_data(b, MAX_SIZE, MAX_SIZE+1, 1'b1) -
extend_data(a, MAX_SIZE, MAX_SIZE+1, 1'b1);
if (sign_of(diff, MAX_SIZE+1)==-1)
hw = TRUE_RESULT;
else
hw = FALSE_RESULT;
end
endfunction
endmodule
|