| 
 Technical Questions
 
- 
How
to model large amount of memory without using too much simulation memory
space?
 
- 
How
to model Transport and Inertial Delays in Verilog?
 
- 
How
to display the system date in $display or $write?
 
- 
How
to display bold characters?
 
- 
How
to compile Verilog files from Emacs? 
  
 
 
 How
to model large amount of memory without using too much simulation memory
space?
The Verilog-XL release directory comes
with a PLI example called "damem". I believe other vendors also provide
it as a PLI example. It was never copyrighted.
 Here are some excerpts from the appnote.
 System tasks:
  $damem_declare
  $damem_read
  $damem_write
  $damem_initb
  $damem_inith
 =============================
 The $damem_declare System Task
 =============================
 The $damem_declare system task declares
a memory in your design. It is an alternative to the use of the reg keyword
to declare an array of regs. When you use the $damem_declare system task
to declare a memory in a design, Verilog-XL does not allocate memory space
in your workstation for that memory in your design until you enter another
system task for dynamically allocated memories ($damem_write,
 $damem_initb, or $damem_inith) that writes
data to that memory in your design. When Verilog-XL allocates this memory
space, it only allocates enough memory space to hold the data written to
that memory in your design.
 $damem_declare(name_of_memory,bit_from,bit_to,
addr_from, addr_to);
 $damem_write (name_of_memory,addr,value);
 $damem_read(name_of_memory,addr,register);
 
  
 How
to model Transport and Inertial Delays in Verilog?
Author : Rajesh Bawankule 
Following simple example can illustrate the
concept.
module delay(in,transport,inertial);
    input in;
    output
transport;
    output
inertial;
    reg  
transport;
    wire  
inertial;
    // behaviour
of delays
    always
@(in)
     
begin
        
transport <= #10 in;
     
end
    assign #10
inertial = in;
 endmodule // delay
 The timing Diagram for input and outputs
                 
_______     __
 in        
_____|     |_____||_______
                    
_______     __
 transport  _________|    
|_____||_____
                    
_______
 inertial  
_________|     |____________
 Non blocking assignment gives you transport
delay. Whenever input changes, output is immediately evaluated and kept
in a event queue and assigned to output after specified "transport" delay.
 In Continuous assign statement the latest
event overrides the earlier event in the queue.
 I am attaching rudimentary testbench and
its output. Hope this helps.
 module test;
    reg 
in;
    wire transport,
inertial;
    // instantiate
delay module
    delay my_delay(in,transport,inertial);
    // apply
inputs
    initial
     
begin
        
in = 0;
        
#20 in = 1;
        
#20 in = 0;
        
#30 in = 1;
        
#5  in = 0;
        
#30 in = 1;
        
#30 $finish;
     
end
    // monitor
signals
    initial
     
begin
        
$monitor($time,"  in = %b  transport = %b inertial = %b",
                 
in,transport, inertial);
     
end
 endmodule // test
 log file
 Compiling source file
"delay.v"
 Highest level modules:
 test
                   
0  in = 0  transport = x inertial = x
                  
10  in = 0  transport = 0 inertial = 0
                  
20  in = 1  transport = 0 inertial = 0
                  
30  in = 1  transport = 1 inertial = 1
                  
40  in = 0  transport = 1 inertial = 1
                  
50  in = 0  transport = 0 inertial = 0
                  
70  in = 1  transport = 0 inertial = 0
                  
75  in = 0  transport = 0 inertial = 0
                  
80  in = 0  transport = 1 inertial = 0
                  
85  in = 0  transport = 0 inertial = 0
                 
105  in = 1  transport = 0 inertial = 0
                 
115  in = 1  transport = 1 inertial = 1
 L35 "delay.v": $finish
at simulation time 135
 81 simulation events
 
  
 How
to display the system date in $display or $write?
(Answers contributed by Swapnajit
Mittra and Noman Hassan) 
Support of $system() task in Verilog-XL, NC-Verilog
and VCS not only allows you to display the system date but also gives you
the ability to call any command that you would normally type on the UNIX
prompt (C executable, script, standard UNIX command etc.), and would make
sense in executing from within Verilog source code.
$system is not an IEEE Standard(1364-1995),
but is supported by both XL and VCS.
 You could read back in the output of $system,
by writing it to another file and reading it back in using $readmemh()
as illustrated in following example.
 module top;
 reg [23:0] today [0:1];
 initial
 begin
     $system("date
+%m%d%y  > date_file");
               
// output is 073199 for july 31st 1999
     $readmemh("date_file",
today);
     $display("Today
is: %x", today[0]);
 end
 endmodule
 
  
 How
to display bold characters?
 Using following program bold characters
can be displayed. Note that this program takes help of UNIX facilities.
This may not work on PC based simulators.
module bold;
  initial begin
    $display
("Normal Text");
    $display
("\033[1mBold Text");
    $display
("\033[mSwitch back to Normal Text.....");
    $display
("\033[7mInverse Text.");
    $display
("\033[mSwitch back to Normal Text.....");
    $display
("\033[1mBold Text \033[mfollowed by \033[7mInverse text \033[m");
  end
 endmodule
  
How
to compile Verilog files from Emacs?
 Contributed
by Petter
Gustad
 You can make Emacs start your simulator by putting this in .emacs (assuming
you're using 
verilog-mode): 
 
(add-hook 'verilog-mode-hook 
(lambda () 
(make-local-variable 'compile-command) 
(setq compile-command "./trun --vcs +SST"))) 
 
Then I have 
(global-set-key [f9] 'compile) 
 
Whenever I hit F9 it will run the compile command. If I'm working on C 
code that will be make. If I'm using verilog mode that will be "./trun --vcs
+SST", e.g. a script to run my testbench and generate a signalscan dump
file. 
 
  |