【SystemVerilog笔记(二)】过程块以及task/function

Verilog与SystemVerilog:过程块、function与task及变量解析
一、过程块
1. always

可综合,用于描述硬件时序电路和组合电路,可以在module或者interface中使用。

2. initial

不可综合,仿真一开始就会执行且只执行一次,可以在module、interface和program中使用。

二、function与task
1. function
  • 可以在参数列表指定输入(input)、输出(output)、输入输出(inout)或者引用参数(ref)。默认数据类型为logic,数组也可以作为形式参数进行传递。
  • 软件行为,在仿真的0时刻开始执行,可以返回数值也可以不返回数值(void)。
  • 内部不能有事件、延时、时序控制语句。
  • 可以调用其它function,但不能调用task。
2. task
  • 硬件行为,不可通过return返回结果,但可通过output或inout端口或者ref来返回
  • 仿真0时刻和非0时刻均可执行,可以内置耗时语句。
  • 既可以调用function,也可以调用其它task。
三、局部变量和全局变量
1. 局部变量
  • 生命周期与其所在域共存亡,如task/function调用结束后局部变量也就不复存在,∴局部变量的生命周期是动态的。
2. 全局变量
  • 生命周期贯穿程序开始执行到结束,∴全局变量的生命周期是静态的。
一般默认变量都是静态的,当然也可以通过static或者autostatic进行显式的声明。
SystemVerilog中,静态任务/函数与自动任务/函数存在多方面的区别: #### 变量存储与生命周期 - **静态任务/函数**:其中声明的局部变量是静态的,在整个仿真过程中只有一份存储。这些变量在任务或函数首次调用时被初始化,并且在后续调用中保留其值。例如: ```systemverilog module static_example; function static void static_func(); integer count = 0; count = count + 1; $display("Static function count: %0d", count); endfunction initial begin static_func(); static_func(); end endmodule ``` 在上述代码中,`count` 变量在每次调用 `static_func` 时会保留其值,第次调用时 `count` 会在前一次的基础上加1。 - **自动任务/函数**:局部变量是动态分配的,每次调用任务或函数时都会为这些变量分配新的存储空间。每次调用结束后,这些变量的存储空间会被释放。例如: ```systemverilog module automatic_example; function automatic void automatic_func(); integer count = 0; count = count + 1; $display("Automatic function count: %0d", count); endfunction initial begin automatic_func(); automatic_func(); end endmodule ``` 这里每次调用 `automatic_func` 时,`count` 都会被初始化为0,输出结果每次都是1。 #### 调用方式与上下文 - **静态任务/函数**:可以在静态上下文中调用,不需要创建对象实例。它们通常用于执行与类实例无关的通用操作。 - **自动任务/函数**:通常与对象实例相关联,在调用时会为其创建新的上下文。当需要每次调用都有独立的变量副本时,使用自动任务/函数更为合适。例如,如果在一个类中定义了自动任务,每个类的对象调用该任务时,任务内的局部变量都是独立的。 #### 参数传递与引用 在静态任务/函数中,引用参数的使用有一定限制。若要在任务/函数中使用引用参数,需将其定义为自动类型,否则会报错,如“reference argument is illegal inside static task - function declaration”,解决方案是把出问题的function或者task定义为automatic类型 [^1]。 ```systemverilog function automatic void DataRead( input int num_data, input string InputFileName, ref logic [7:0] din_i[128], ref logic [7:0] din_q[128] ); // function body endfunction ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值