PROGRAM BLOCK
The module is the basic building block in Verilog which works well for Design. However, for the testbench, a lot of effort is spent getting the environment properly initialized and synchronized, avoiding races between the design and the testbench, automating the generation of input stimuli, and reusing existing models and other infrastructure.
Systemverilog adds a new type of block called program block. It is declared using program and endprogram keywords.
The program block serves these basic purposes:
-> Separates the testbench from the DUT.
-> The program block helps ensure that test bench transitions do not have race conditions with the design
-> It provides an entry point to the execution of testbenches.
-> It creates a scope that encapsulates program-wide data.
-> It provides a syntactic context that specifies scheduling in the Reactive region which avoids races.
-> It doesnot allow always block. Only initial and methods are allowed, which are more controllable.
-> Each program can be explicitly exited by calling the $exit system task. Unlike $finish, which exits simulation immediately, even if there are pending events.
-> Just like a module, program block has ports. One or more program blocks can be instantiated in a top-level netlist, and connected to the DUT.
The program construct serves as a clear separator between design and testbench, and, more importantly, it specifies specialized execution semantics in the Reactive region for all elements declared within the program. Together with clocking blocks, the program construct provides for race-free interaction between the design and the testbench, and enables cycle and transaction level abstractions.
For example:
program test (input clk,input[16:1] addr,inout[7:0]data);
initial...
endprogram
program test (interface device_ifc );
initial...
endprogram
program schedules events in the Reactive region, the clocking block construct is very useful to automatically sample the steady-state values of previous time steps or clock cycles. Programs that read design values exclusively through clocking blocks with #0 input skews are insensitive to read-write races. It is important to note that simply sampling input signals (or setting non-zero skews on clocking block inputs) does not eliminate the potential for races. Proper input sampling only addresses a single clocking block. With multiple clocks, the arbitrary order in which overlapping or simultaneous clocks are processed is still a potential source for races.
Following example demonstrates the difference between the module based testbench and program based testbenchs.
moduleDUT();
reg q =0;
reg clk =0;
initial
#10 clk =1;
always@(posedge clk)
q <=1;
endmodule
module Module_based_TB();
always@(posedgeDUT.clk)$display('Module_based_TB : q = %bn',DUT.q);
endmodule
program Program_based_TB();
initial
forever@(posedgeDUT.clk)$display('Program_based_TB : q = %bn',DUT.q);
endprogram
RESULT:
Module_based_TB : q = 0
program_based_TB : q = 1
The module is the basic building block in Verilog which works well for Design. However, for the testbench, a lot of effort is spent getting the environment properly initialized and synchronized, avoiding races between the design and the testbench, automating the generation of input stimuli, and reusing existing models and other infrastructure.
Systemverilog adds a new type of block called program block. It is declared using program and endprogram keywords.
The program block serves these basic purposes:
-> Separates the testbench from the DUT.
-> The program block helps ensure that test bench transitions do not have race conditions with the design
-> It provides an entry point to the execution of testbenches.
-> It creates a scope that encapsulates program-wide data.
-> It provides a syntactic context that specifies scheduling in the Reactive region which avoids races.
-> It doesnot allow always block. Only initial and methods are allowed, which are more controllable.
-> Each program can be explicitly exited by calling the $exit system task. Unlike $finish, which exits simulation immediately, even if there are pending events.
-> Just like a module, program block has ports. One or more program blocks can be instantiated in a top-level netlist, and connected to the DUT.
The program construct serves as a clear separator between design and testbench, and, more importantly, it specifies specialized execution semantics in the Reactive region for all elements declared within the program. Together with clocking blocks, the program construct provides for race-free interaction between the design and the testbench, and enables cycle and transaction level abstractions.
For example:
program test (input clk,input[16:1] addr,inout[7:0]data);
initial...
endprogram
program test (interface device_ifc );
initial...
endprogram
program schedules events in the Reactive region, the clocking block construct is very useful to automatically sample the steady-state values of previous time steps or clock cycles. Programs that read design values exclusively through clocking blocks with #0 input skews are insensitive to read-write races. It is important to note that simply sampling input signals (or setting non-zero skews on clocking block inputs) does not eliminate the potential for races. Proper input sampling only addresses a single clocking block. With multiple clocks, the arbitrary order in which overlapping or simultaneous clocks are processed is still a potential source for races.
Following example demonstrates the difference between the module based testbench and program based testbenchs.
moduleDUT();
reg q =0;
reg clk =0;
initial
#10 clk =1;
always@(posedge clk)
q <=1;
endmodule
module Module_based_TB();
always@(posedgeDUT.clk)$display('Module_based_TB : q = %bn',DUT.q);
endmodule
program Program_based_TB();
initial
forever@(posedgeDUT.clk)$display('Program_based_TB : q = %bn',DUT.q);
endprogram
RESULT:
Module_based_TB : q = 0
program_based_TB : q = 1
Systemverilog Spec
Module Declaration A module is the principal design entity in Verilog. The first line of a module declaration specifies the name and port list (arguments). The next few lines specifies the i/o type (input, output or inout, see Sect. ) and width of each port. The default port width is 1 bit. .SystemVerilog is a superset of another HDL: Verilog –Familiarity with Verilog (or even VHDL) helps a lot.Useful SystemVerilog resources and tutorials on the course project web page –Including a link to a good Verilog. We have seen that assertions can be included directly in the source code of the modules in which they apply. They can even be embedded in procedural code. Alternatively, verification code can be written in a separate program, for example, and that program can then be bound to a specific module or module. Nonblocking in Verilog. The concept of Blocking vs. Nonblocking signal assignments is a unique one to hardware description languages. The main reason to use either Blocking or Nonblocking assignments is to generate either combinational or sequential logic. In software, all assignments work one at a time. So for example in the C. Verilog - Modules The module is the basic unit of hierarchy in Verilog I Modules describe: I boundaries module, endmodule I inputs and outputs ports I how it works behavioral or RTL code I Can be a single element or collection of lower level modules I Module can describe a hierarchical design (a module of modules).