Verilog 中 task 的语法,及使用 task 来完成模块的 testbench

概述

Verilog 中的 task 是一种不可综合的语法,它既提供了从不同位置执行公共过程的能力(因为这样可以实现代码共享),也提供了把大过程切分成小过程的能力(因为小过程更便于阅读和调试)。相较于 function, task 的 input 和 output 是可选项,同时其中也可以包含延迟控制语句,常被用在 testbench 中。

task 的语法

task的使能,就是从一条包含有传进去的参数和用于接受结果的变量的调用语句,控制从调用的过程转到 task。当 task 完成的时候,控制再传回调用的过程。所以如果 task 包含时序控制的语句,那么调用 task 的时间和退出 task 的时间可以是不一样的。 task 可以再使能(调用)其他 task,没有数量的限制。

task 声明的语法如下:

task [automatic] task_name (
	port_declaration port_name, port_name, ... ,
	port_declaration port_name, port_name, ... );
	local variable declarations
	procedural_statement or statement_group
endtask

序列检测模块

只要理解了 task 的用法,我们就可以自然而然地把它用到各种模块的 testbench 编写中。

下面是一个检测“10110”序列的模块,在检测到后令 detected = 1.

`timescale 1ns / 1ns

module detector
(
 input clk ,
 input rst_n ,
 input data ,
 output reg detected
);

localparam IDLE = 3'b000 ,
             S0 = 3'b001 ,
             S1 = 3

你可能感兴趣的:(Verilog)