Saturday, September 26, 2015

Compilation And Simulation Directives



Compilation And Simulation Directives:













Conditional Compilation directive switches vs Simulation directive switches




Verilog has following conditional compiler directives.







`ifdef

`else

`elsif

`endif

`ifndef







The `ifdef compiler directive checks for the definition of a text_macro_name. If the text_macro_name is defined, then the lines following the `ifdef directive are included. If the text_macro_name is not defined and an `else directive exists, then this source is

compiled. The `ifndef compiler directive checks for the definition of a text_macro_name. If the text_macro_name is not defined, then the lines following the `ifndef directive are included. If the text_macro_name is defined and an `else directive exists, then this source is compiled. If the `elsif directive exists (instead of the `else) the compiler checks for the definition of the text_macro_name. If the name exists the lines following the `elsif directive are included. The `elsif directive is equivalent to the compiler directive sequence `else `ifdef ... `endif. This directive does not need a corresponding `endif directive. This directive must be preceded by an `ifdef or `ifndef directive.










EXAMPLE:

module switches();




initial

begin

`ifdef TYPE_1

$display(" TYPE_1 message ");

`else

`ifdef TYPE_2

$display(" TYPE_2 message ");

`endif

`endif

end

endmodule










Compile with +define+TYPE_1

Then simulate,result is







RESULT:




TYPE_1 message










Compile with +define+TYPE_2

Then simulate,result is










RESULT:




TYPE_2 message










TYPE_1 and TYPE_2 are called switches.




In the above example, When TYPE_1 switch is given, statement " $display(" TYPE_1 message "); " is only compile and statement " $display(" TYPE_2 message "); " is not compiled.

Similarly for TYPE_2 switch. It wont take much time to compile this small example. Compilation time is not small for real time verification environment. Compiler takes time for each change of conditional compilation switches.




Simulation directives are simple. This is archived by `define macros. The following example demonstrated the same functionality as the above example.










EXAMPLE:




module switches();




initial

begin

if($test$plusargs("TYPE_1"))

$display(" TYPE_1 message ");

else

if($test$plusargs("TYPE_2"))

$display(" TYPE_2 message ");

end

endmodule










No need to give +define+TYPE_1 or +define+TYPE_2 during compilation




Simulate with +TYPE_1







RESULT:




TYPE_1 message













Simulate with +TYPE_2

Then simulate,result is







RESULT:




TYPE_2 message










With the above style of programing,we can save recompilation times.







This system function searches the list of plusargs (like the $test$plusargs system function) for a user specified plusarg string. The string is specified in the first argument to the system function as either a string or a register which is interpreted as a string. If the string is found, the remainder of the string is converted to the type specified in the user_string and the resulting value stored in the variable provided. If a string is found, the function returns a non-zero integer. If no string is found matching, the function returns the integer value zero and the variable provided is not modified.




%d decimal conversion

%o octal conversion

%h hexadecimal conversion

%b binary conversion

%e real exponential conversion

%f real decimal conversion

%g real decimal or exponential conversion

%s string (no conversion)




The first string, from the list of plusargs provided to the simuator, which matches the plusarg_string portion of the user_string specified shall be the plusarg string available for conversion. The remainder string of the matching plusarg (the remainder is the part of the plusarg string after the portion which matches the users plusarg_string) shall be converted from a string into the format indicated by the format string and stored in the variable provided. If there is no remaining string, the value stored into the variable shall either be a zero (0) or an empty string value.













Example







module valuetest();




integer i;

real r;

reg [11:0] v;

reg [128:0] s;




initial

begin

if($value$plusargs("STRING=%s",s))

$display(" GOT STRING ");

if($value$plusargs("INTG=%d",i))

$display(" GOT INTEGER ");

if($value$plusargs("REAL=%f",r))

$display(" GOT REAL ");

if($value$plusargs("VECTOR=%b",v))

$display(" GOT VECTOR ");




$display( " String is %s ",s);

$display(" Integer is %d ",i);

$display(" Realnum is %f ",r);

$display(" Vector is %b ",v);

end




endmodule




Compilation :

command filename.v

Simulation :

command +STRING=rrf +INTG=123 +REAL=1.32 +VECTOR=10101




RESULTS:




GOT STRING

GOT INTEGER

GOT REAL

GOT VECTOR

String is rrf

Integer is 123

Realnum is 1.320000e+00

Vector is 000000010101




//copied from testbench.in & edited

No comments:

Post a Comment

Ethernet and more

Ethernet is a protocol under IEEE 802.33 standard User Datagram Protocol (UDP) UDP is a connectionless transport protocol. I...