玩命加载中 . . .

systemverilog任务、函数、program


  • 缺省情况下参数的类型是与其前一个参数相同的,而第一个参数的缺省类型是logic单bit输入
  • 参数的传递方式可以使用ref指定为引用,通常用于数组引用;当不希望子程序改变数组值时,可以使用const ref类型
  • ref参数只能被用于带自动存储(automatic)的子程序中,即使用ref参数时子程序必须指明automatic属性
  • 自动存储相对的是静态存储,当多个地方调用静态存储子程序时,不同的线程之间会窜用这些局部变量,而自动存储能够迫使仿真器使用堆栈存储局部变量
  • 函数使用return返回一个值,调用时可以使用void忽略返回值,例如void'($fscanf(file,"%d",i));
module test_func();

int arr[];

//************************************
// operator = "+", return a.sum
// operator = "x", return a.product
//************************************
function automatic int alu(
    const ref int a[],           //数组引用,const不能改变数组
    input string operator = "+"  //指定default值
);

int result;

if(operator=="x") begin
  result = 1;
  for(a[i])
    result *= a[i];
end
else begin
  result = 0;
  for(a[i])
    result += a[i];
end

return result;
endfunction

initial begin
  arr = new[5];
  arr = '{1,2,3,4,5};
  $display(alu(arr));    //15, use default operator
  $display(alu(arr,"x")) //120
end

endmodule

program

program与module相同点

  • 和module相同,program也可以定义0个或多个输入、输出、双向端口。
  • 一个program块内部可以包含0个或多个initial块、generate块、specparam语句、连续赋值语句、并发断言、timeunit声明。
  • 在program块中数据类型、数据声明、函数和任务的定义均与module块类似。
  • 一个设计中可以包含多个program块,这些program块既可以通过端口交互,也可以相互独立,这一点与module块也是相似的。

program与module不同点

  • 一个program块不能包含任何always块,用户自定义原语(UDP),module块、接口(interface)、program块
  • module中可以定义program块
  • 一个program块可以调用其他module块或者program块中定义的函数或任务,但是一个module块却不能调用其他program块中定义的任务或函数。
  • program块中变量只能用阻塞赋值,不能使用非阻塞赋值

本文作者: 董续胜

本文链接: https://dxsm.github.io/p/sv-learning-chap2.html

版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!


 评论