Skip to main content

Verilog-'timescale


System tasks $time and $realtime are used to return  current simulation time.
'timescale <time unit> <time precision>
Examples
'timescale 1ns/1ps
'timescale 10ns/1ns
'timescale 1ns/1ns

Example-1
/ Declare the timescale where time_unit is 1ns
// and time_precision is 1ps
`timescale 1ns/1ps
 
// NOTE: Testbench is the same as in previous example
module top;
  // To understand the effect of timescale, let us 
  // drive a signal with some values after some delay
  reg data;
 
  initial begin
    // Initialize the signal to 0 at time 0 units
    data <= 0;
 
    // Advance by 1 time unit, display a message and toggle val
    #1     $display ("Time=%0t At time #1", $realtime);
    data <= 1;
 
    // Advance by 0.49 time unit and toggle val
    #0.49   $display ("Time=%0t At time #0.49", $realtime);
    data <= 0;
 
    // Advance by 0.50 time unit and toggle val
    #0.50   $display ("Time=%0t At time #0.50", $realtime);
    data <= 1;
 
    // Advance by 0.51 time unit and toggle val
    #0.51   $display ("Time=%0t At time #0.51", $realtime);
    data <= 0;
 
    // Let simulation run for another 5 time units and exit
    #5 $display ("Time=%0t End of simulation", $realtime);
  end
endmodule
In first time delay, #1 is multiplied with time 1ns=1000ps  (1000*1=1000ps) while time precision is 1ps. second timedelay, #0.49 is multiplied by 1000ps (1000*0.49=490ps) and this value is more than precision value 1ps, therefore, total time delay is 1000+490=1490 ps
In third case, #0.50 delay is (1000ps*0.50) 500 ps, therefore, total delay is 1490+500=1990 ps
In fourth delay, #0.51 delay is (1000*0.51) 510 ps, therefore, total delay is  1990+510= 2500 ps
Last delay is #5 which is equal to 5000 ps, therefore, total delay =2500+5000=7500 ps

Therefore, the simulation blog is as follows:

# run 1000ns
Time=1000 At time #1
Time=1490 At time #0.49
Time=1990 At time #0.50
Time=2500 At time #0.51
Time=7500 End of simulation

Example-2
/ Declare the timescale where time_unit is 1ns
// and time_precision is 1ps
`timescale 10ns/1ns
 
// NOTE: Testbench is the same as in previous example
module top;
  // To understand the effect of timescale, let us 
  // drive a signal with some values after some delay
  reg data;
 
  initial begin
    // Initialize the signal to 0 at time 0 units
    data <= 0;
 
    // Advance by 1 time unit, display a message and toggle val
    #1     $display ("Time=%0t At time #1", $realtime);
    data <= 1;
 
    // Advance by 0.49 time unit and toggle val
    #0.49   $display ("Time=%0t At time #0.49", $realtime);
    data <= 0;
 
    // Advance by 0.50 time unit and toggle val
    #0.50   $display ("Time=%0t At time #0.50", $realtime);
    data <= 1;
 
    // Advance by 0.51 time unit and toggle val
    #0.51   $display ("Time=%0t At time #0.51", $realtime);
    data <= 0;
 
    // Let simulation run for another 5 time units and exit
    #5 $display ("Time=%0t End of simulation", $realtime);
  end
endmodule
In first time delay, #1 is multiplied with time 10ns  (10*1=10 ns) while time precision is 1ns. Second timedelay, #0.49 is multiplied by 10ns (10*0.49=4.9ns) and this value is more than precision value 1ns, therefore, total time delay is 10+4.9=14.9 ns which gets rounded to become 15 ns.
In third case, #0.50 delay is (10ns*0.50) 5 ns, therefore, total delay is 15+5.0=20 ns
In fourth delay, #0.51 delay is (10*0.51) 5.1 ns, therefore, total delay is  20+5.1= 25 ns
Last delay is #5 which is equal to 50 ns, therefore, total delay =25+50=75 ns

Therefore, the simulation blog is as follows:

Time=10 At time #1
Time=15 At time #0.49
Time=20 At time #0.50
Time=25 At time #0.51
Time=75  End of simulation

Comments

Popular posts from this blog

Verilog HDL: Structured Procedures: Initial Statement

Structured Procedures: used in behavioral modelling There are two structured procedure statements in Verilog: always and initial. These statements are the two most basic statements in behavioral modeling. All other behavioral statements can appear only inside these structured procedure statements. Verilog is a concurrent programming language unlike the C programming language, which is sequential in nature. Activity flows in Verilog run in parallel rather than in sequence. Each always and initial statement represents a separate activity flow in Verilog. Each activity flow starts at simulation time 0. The statements always and initial cannot be nested. 1. Initial Statement All statements inside an initial statement constitute an initial block. An initial block starts at time 0, executes exactly once during a simulation, and then does not execute again. If there are multiple initial blocks, each block starts to execute concurrently at time 0. Each block finishes execution in

VERILOG HDL: Vectors and arrays

Vectors:  Nets or reg data types in verilog HDL can be declared as vectors (a word of multiple bits). wire a;      // single bit variable. wire [4:0]b;  //5-bit vector wire reg clock;     // scalar register reg [0:31] bus;  // 32-bits bus register reg [63:0]count1;  // 64-bit register count1 reg [0:31]count2;   // 32-bit register count2 Part select of a variable vector bus[31]=1'b0;   // set 31th bit of bus count1[0]; // 0th bit of count1 register count1[31-:8] ;  //// start bit=31, width=8=> data[31:24] count1[24+:8] ;  //// start bit=24, width=8=> data[31:24] count2[31-:8] ;  //// start bit=31, width=8=> data[24:31] count2[24+:8] ;  //// start bit=24, width=8=> data[24:31] //in a loop to select all bytes of the vector. input a,b; reg j; reg [255:0]data1; reg [0:255]data2; alsways@ (a,b) begin for (j=0; j<=31; j=j+1) byte = data1[(j*8)+:8]; //Sequence is [7:0], [15:8]... [255:248] //Can initialize a part of the vector data1[(byteN

Vrilog HDL: Nonblocking Procedural Assignments

Nonblocking Procedural Assignment Nonblocking assignments allow scheduling of assignments without blocking execution of the statements that follow in a sequential block. A <= operator is used to specify nonblocking assignments. Note that this operator has the same symbol as a relational operator, less_than_equal_to. The operator <= is interpreted as a relational operator in an expression and as an assignment operator in the context of a nonblocking assignment. To illustrate the behavior of nonblocking statements and its difference from blockinglets take an example. Example: reg x, y, z; reg [15:0] reg_a, reg_b; integer count; //All behavioral statements must be inside an initial or always block initial begin x = 0; y = 1; z = 1; //Scalar assignments count = 0; //Assignment to integer variables reg_a = 16'b0; reg_b = reg_a; //Initialize vectors reg_a[2] <= #15 1'b1; //Bit select assignment with delay reg_b[15:13] <= #10 {x, y, z}; //Assign result