verilog中module、class、function、task、package、program的结构组成

1.module(模块)的结构组成:
verilog中module、class、function、task、package、program的结构组成_第1张图片
例如,上升沿D触发器:

module dff(din,clk,q);
       input din,clk;
       output q;
       reg q;
       always@(posedge clk)
             q<=din;
endmodule

2.class(类)的结构组成:
class封装了数据和操作这些数据的子程序(包括task和function)。
例如:

class Transaction;
      logic[31:0] addr,crc,data[8];

      function new;
         addr=3;
         foreach (data[i])
            data[i]=5;
      endfunction
endclass

3.task的结构组成:
在第一行的任务名后面不能出现输入、输出端口列表;task可以没有返回值;task可以调用其他的task和function;task对于返回值没有限制。
task的调用格式:
<任务名>(端口1,端口2,……,端口n)

task<任务名>;
    端口和类型声明
	局部变量声明
   begin
      语句1;
	  语句2;
	  ……
   end
endtask

4.function的结构组成:
function内不含有时延、时序、事件控制结构;只有一个返回值。在第一行function语句块中不能出现端口名列表。

function<返回值类型或位宽><函数名>
<输入参量与类型声明>
<局部变量声明>
   begin
      语句1;
	  语句2;
	  ……
	  语句n;
   end
endfunction

function的调用:
<函数名>(<输入表达式1>,<输入表达式2>……<输入表达式n>);
5.package的结构组成:
package可以解决类的归属问题;可以在多个module、interface、program中共享parameter、data、type、task、function、class等方法。
例如:

package regs_pkg;
   'include "stimulator.sv"
   'include "monitor.sv"
   'include "chker.sv"
endpackage

package将命名空间分隔开,这样使用不同package中的同名类时只要注明使用哪一个package中的即可。(域名检索操作符::)

module mcdf_tb;
  regs_pkg::monitor mon1=new();
  arb_pkg::monitor mon2=new();
endmodule

6.program的结构组成:
为避免仿真和设计竞争问题(race condition),systemverilog中引入了program的概念。
PS:program的注意事项:
1.program中不能例化其他program和module;不能出现always;program内部可以发起多个initial块。
2.program中的initial块和module中的initial块执行位置不同,前者在reactive,后者在active块中执行。
3.program中存在的多个initial块中,如果有一个initial采用了退出系统函数$exit(),则会结束该program,而不仅仅是该initial块。

你可能感兴趣的:(fpga开发)