Re: [sv-bc] Are $signed/$unsigned constant expressions?

From: Brad Pierce <Brad.Pierce_at_.....>
Date: Wed Jul 12 2006 - 23:04:57 PDT
Surya,

 

Yes, all conversion system functions, including $signed() and
$unsigned(), can be used in constant expressions, as specified in 17.8
of IEEE Std 1364-2005.

 

-- Brad

 

________________________________

From: owner-sv-bc@eda-stds.org [mailto:owner-sv-bc@eda-stds.org] On
Behalf Of Surya Pratik Saha
Sent: Wednesday, July 12, 2006 10:09 PM
To: sv-bc@eda.org; sv-bc@eda-stds.org
Subject: [sv-bc] Are $signed/$unsigned constant expressions?

 

Hi, 
Verilog 2K LRM does not consider a system function as constant. But
Verilog 2005 enhanced it and considered some system functions as
constant expressions provided their arguments are also constants. 

Verilog 2005: (Section 5. Expressions) 
Constant system function calls are calls to certain built-in system
functions where the arguments are constant 
expressions. When used in constant expressions, these function calls
shall be evaluated at elaboration time. 
The system functions which may be used in constant system function calls
are "pure" functions, i.e. those 
whose value depends only on their input arguments and which have no side
effects. Specifically, the system 
functions allowed in constant expressions are the conversion system
functions listed in 17.8 and the 
mathematical system functions listed in 17.11. 

17.8 Conversion functions listed following system functions: 
$rtoi converts real values to integers by truncating the real value (for
example, 123.45 becomes 123) 
$itor converts integers to real values (for example, 123 becomes 123.0) 
$realtobits passes bit patterns across module ports; converts from a
real number to the 64-bit 
representation (vector) of that real number 
$bitstoreal is the reverse of $realtobits; converts from the bit pattern
to a real number. 

17.11 Math functions includes only  $clog2 (yet to be implemented in
Cheetah). 

SV 1800 LRM further enhances the list so that $bits and array query
functions also can be considered as constant 
expressions. 

So are $signed/$unsigned constant expressions? 
Is the following case valid? 

   module test(); 
      dut dut(); 
   endmodule // test 

   module dut(i, o1, o2, o3, o4); 
      input [3:0] i; 
      output [7:0] o1, o2, o3, o4; 
      reg [7:0]    o2, o3, o4; 
      parameter    P = 2; 
      localparam LP1 = P + 1; 
      localparam signed [2:0] LP2 = LP1 - 1; 
      localparam signed [7:0] LP3 = $signed(LP2[1:0]); // Is it constant
or not 
      assign o1 = LP2 * i + LP3; 
      always @(i) begin : block 
         localparam LQ1 = LP3 * LP3; 
         o2 = LQ1; 
         begin : block2 
            localparam LQ2 = 3'sd1; 
            o3 = LQ2 + $signed(o2); 
         end 
         o4 = foo(i) + foo(1); 

      end 

      function foo; 
         localparam LR1 = P+P; 
         input [2:0] fi; 
         foo = fi * LR1; 
      endfunction // foo 

   endmodule // dut 

MTI-Vlog is failing. 
Synopsys VCS is passing. 

-- 
Regards
Surya.

 
Received on Wed Jul 12 23:05:18 2006

This archive was generated by hypermail 2.1.8 : Wed Jul 12 2006 - 23:05:25 PDT