SV学习(2)——过程语句、函数和任务、变量声明周期

本文深入讲解SV语言的过程语句、函数和任务等核心概念。涵盖了硬件过程块、赋值语句、控制语句等语法特性,并对函数和任务进行了详细区分。此外,还介绍了变量的生命周期、自动存储等内容。

1. 过程语句

1.1. 硬件过程块

在SV中首先需要清楚哪些语句应该被放置于硬件世界,哪些程序应该被放置于软件世界;
为了区分硬件世界和软件世界,先引申出一个概念域(scope)。为了区分硬件设计、软件设计,我们将定义的软件变量或者例化的硬件其所在的空间称之为域;
module / endmodule,interface / endinterface可以被视为硬件世界,program / endprogram和class / endclass可以被视为软件世界。

always是为了描述硬件的行为,而在使用时需要注意哪些使用方式是时序电路描述,哪种使用方式事组合电路描述;
always中的 @(event …) 敏感列表是为了模拟硬件信号的触发行为,同学们需要正确对标硬件行为和always过程块描述。需要理解硬件行为的核心要素有哪些?
所以说,always过程块是用来描述硬件时序电路和组合电路的正确打开方式,因此只可以在module或者interface中使用;

always具备描述硬件电路行为的核心要素,你认为下列哪些事正确使用always的方式?

  • 由时钟驱动
  • 由其他非时钟信号驱动
  • 不同always语句块之间是并行执行的
  • 可以在always中初始化变量

always中,可以对对应的信号做复位,初始化变量是一个软件的概念,通常在定义变量的时候或者在initial中进行初始化。

initial从名字也看得出来,与always在执行路径上有明显区别,即initial非常符合软件的执行方式,即只执行一次;
initial和always一样,无法被延迟执行,即在仿真一开始它们都会同时执行,而不同initial和always之间的执行顺序上是没有顺序可言的,因此不应该将它们在代码中的前后顺序与它们的执行顺序画上等号;
initial从其执行路径的属性来看,它不应该存在于硬件设计代码中,它本身不可综合,对于描述电路没有任何帮助;
initial就是为了测试而生的,由于测试需要按照时间顺序的习惯,即软件方式来完成,所以initial便可以实现这一要求;

在Verilog时代,所有的测试语句都可以被放置在initial中,为了便于统一管理测试顺序,建议将有关测试语句都放置在同一个initial过程块中;
initial过程块可以在module、interface和program中使用;
对于过程块的书写方式,请记住用begin…end将其作用域“包”住,这一建议同样适用于稍后提到的控制语句、循环语句等;

1.2. 赋值语句

SV比verilog多了自加和自减操作符,允许变量自身可以将当前值做递增或递减。

assign优先级高于普通过程赋值语句,所以处于连续赋值状态的寄存器变量将忽略普通过程赋值语句对它的过程赋值操作,其逻辑状态仍然由过程连续赋值语句表达式做决定。使用assign对寄存器型变量赋值之后,这个值将一直保持在这个寄存器上,直至遇上deassign。

// assign_example

module test_assign ( );
	wire	[ 9: 0]	net_data [10: 0];
	
	initial	begin
		logic	[ 9: 0]	data	[10: 0]	;
		logic	[ 9: 0]	var_data		;
		
		data[0]	<=	'x;		// 非阻塞赋值
		data[1]	=	'z;		// 阻塞赋值
		
		#5 data[2]	=	7;
		#5 data[2]++;			// 变量自加
		#5 data[2]--;			// 变量自减
		
		#5 assign var_data	=	data[2];	// 连续赋值语句将7赋值给var_data
		#5 var_data	=	4;				// 不会改变var_data地数值
		#5 deassign	var_data;			// 去除连续连续赋值地作用
		#5 var_data	=	5;				// var_data的值改变了
		
		#5 force 	var_data	=	data[1];
		#5	var_data	=	8;
		#5 release	var_data;
		#5 var_data	=	9;	
		
		#5 force 	net_data[1]	=	10'h00;
		#5 release	net_data[1];
	end

endmodule 

在这里插入图片描述

1.3. 控制语句

1.3.1. for循环

SV允许在循环内产生一个本地变量,其他并行循环不会偶然地影响这个循环控制变量

	for (int i = 0, j = 0; i < 256; i++, j++)
		...

1.3.2. while循循环

举例,计算向量中1的个数

	// while_example
	
	module test_while ( );
			logic	[ 3: 0]	count;
			logic	[ 7: 0]	temp;
			
		initial	begin
			count	= 0;
			temp	= 8'b0011_1100;
			#10
			while (temp)	begin
				if (temp[0] == 1'b1)
					count ++;
				// temp = temp >> 1;
				temp = {
   
   1'b0, temp[7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值