Guía de escritura de la plataforma de prueba de verificación de SystemVerilog Capítulo 2 Tipos de datos

2.1 Tipos de datos integrados
Generalmente, en Verilog, tenemos dos tipos de datos comunes: variables y redes. Cada uno tiene cuatro estados: 0, 1, Z y X. Las aplicaciones más comunes son reg y wire.
Variable
Número sin signo : reg
Número con signo de 32 bits: entero Número sin signo de
64 bits o número de coma flotante: tiempo
Se pueden almacenar varias variables juntas en una matriz de ancho fijo. Todo el almacenamiento es estático, lo que significa que todas las variables están activas durante la simulación.
Red de alambre
alambre de
red de línea se emplea generalmente a diferentes partes de conexión del diseño. Suele ser el puerto que conecta el módulo de diseño.

2.1.1 tipo lógico (lógico)
En comparación con el tipo de registro Verilog habitual, el tipo lógico se ha mejorado sobre la base del mismo, de modo que no solo puede usarse como una variable, sino tambiénImpulsado por asignación continua, unidad de puerta y módulo. Cualquier dato que use el tipo de malla de alambre puede usar la lógica.la lógica no puede tener múltiples controladores estructuralesAl definir un bus bidireccional, solo puede usar cable en lugar de lógica.
2.1.2 Tipos de datos de dos estados
En comparación con los tipos de datos de cuatro estados (0, 1, X, Z), SystemVerilog presenta tipos de datos de dos estados (0, 1), lo que ayuda a mejorar el rendimiento del simulador y reducir la memoria Uso.
Bit de tipo de datos de un solo bit sin signo, los tipos de datos con signo son byte, shortint, int, longint.
Ejemplo 2.2 Tipo de datos firmado

bit b;           //双状态,单比特,无符号
bit [31:0] b32;  //双状态,32比特无符号整数
int unsigned ui; //双状态,32比特无符号整数
int i;           //双状态,32位有符号整数
byte b8;         //双状态,8比特有符号整数,取值范围为-128~127
shortint s;      //双状态,16比特有符号整数
longint l;       //双状态,64比特有符号整数
integer i4;      //四状态,32比特有符号整数
time t;          //四状态,64比特无符号整数
real r;          //双状态,双精度浮点数

2.2 Matriz de ancho fijo
2.2.1 Declaración e inicialización de la matriz de ancho fijo
Todas las matrices están indexadas con 0 como punto de partida, Por lo que SystemVerilog permite una manera conveniente de declarar solo el ancho de la matriz.
Ejemplo 2.4 Declaración de una matriz de ancho fijo

int lo_hi [15:0]; //16个整数[0]...[15]
int c_style [16]; //16个整数[0]...[15]

Cree una matriz multidimensional de ancho fijo especificando dimensiones después del nombre de la variable.
Ejemplo 2.5 Declaración y uso de una matriz multidimensional con 8 filas y 4 columnas

int array2 [0:7] [0:3]; //完整的声明
int array3 [8][4];      //紧凑的声明
int array2 [7][3]=1;    //设置最后一个元素为1

En SystemVerilog, el emulador usa límites de palabras de 32 bits al almacenar elementos de datos, por lo que byte, shortint e int se colocan en una palabra, y longint se coloca en dos palabras.
2.2.2 Matriz constante
Una comilla simple y paréntesis para inicializar la matrizTenga en cuenta que las comillas simples aquí son diferentes de las comillas simples en las pautas del compilador o las definiciones de macro.
Ejemplo 2.7 Inicializando una matriz

int ascend [4]='{0,1,2,3}; //对4个元素进行初始化
int descend [5];

descend='{4,3,2,1,0};      //对5个元素进行初始化
descend[0:2]='{5,6,7};     //对前三个元素赋值
ascend=‘’{4{8}};          //四个值全部为8
descend ='{9,8,default:1}; //{9,8,1,1,1}

2.2.3 Operaciones básicas
de matrices, la forma más común para operar foreach en ellas esUsar para o para cada bucle. La función $ size devolverá automáticamente el ancho de la matriz. Foreach loop solo necesita especificar el nombre de la matriz y dar el índice entre corchetes detrás de él, SystemVerilog recorrerá automáticamente los elementos de la matriz.
Ejemplo 2.8 Uso de bucles for y foreach en operaciones de matriz

module test_enum();
initial begin
	bit[31:0] src[5],dst[5];
	int i,j; //无需对i,j进行类型定义
	for(int i=0;i< $size(src);i++)
		begin
		src[i]=i;
		$display("src[%0d]=%0d",i,src[i]);
		end
	foreach(dst[j])
		begin
		dst[j]=src[j]*2; //dst的值是src的两倍
		$display("dst[%0d]=%0d",j,dst[j]);
	end
endmodule

El subíndice de los corchetes del bucle foreach de la matriz multidimensional no es [i] [j], sino [i, j].
Ejemplo 2.9 Inicializando y atravesando una matriz multidimensional

module test_enum();
int md[2][3]='{'{0,1,2},'{3,4,5}}; //对多维数组的赋初始值是在initial之外
initial begin     
	$display("Initial value:");
	// int i,j; //并不需要对i,j进行类型定义
	foreach(md[i,j]) //这是正确的语法格式
		$display("md[%0d][%0d]=%0d",i,j,md[i][j]);                  

	$display("new value:");
	//对最后三个元素重复赋值5
	md='{'{9,8,7},'{3{32'd5}}};
	foreach(md[i,j]) //这是正确的语法格式
		$display("md[%0d][%0d]=%0d",i,j,md[i][j]);
end 
endmodule

Ejemplo 2.11 Impresión de una matriz multidimensional

module test_enum();
initial begin
	byte twoD[4][6];
	foreach(two[i,j])
		twoD[i][j]=i*10+j;
     
	foreach(twoD[i]) //遍历第一个维度
		begin
		$write("%0d:",i);
		foreach(two[,j]) //遍历第二个维度
			$write("%3d",two[i][j]);  //利用位宽来表示空格
		$display;
	end
end     
endmodule

2.2.4 Operaciones básicas de matriz: copiar y comparar
Ejemplo 2.13 Operaciones de copia y comparación de matrices

module test_enum();
	bit[31:0] src[5]='{0,1,2,3,4},
	dst[5]='{5,4,3,2,1};   //赋初始值放在外面
	initial
	begin
	//两个数组的聚合比较
		if(src = = dst)
			$display("src = = dst");
		else
			$display("src!=dst");
		
		dst=src; //将src赋给dst
		src[0]=5; //将src的第一个元素赋值为5
		$display("src %s dst",(src== dst)? "= = ":"!=");  //以这种方式来比较,所有元素的值是否相等
		$display("src[1:4] %s dst[1:4]", //使用数组片段对第1-4个元素进行比较
					(src[1:4]  = = dst[1:4])? "==":"!=");
end     
endmodule

2.2.5 Varias formas de expresar matrices
1) Uso simultáneo de subíndices de matriz y subíndices de bits
Ejemplo 2.14 Imprima el primer elemento de la matriz (binario 101), su dígito menos significativo (1) y los dos dígitos inmediatamente más altos ( Binario 10).

initial begin
	bit [31:0] src[5]='{5{5}};
	$displayb (src[0],,       //'b101或'd5
				src[0][0],,   //'b1
				src[0][2:1]); //'b10
end

2) Combinar matriz
Al declarar una matriz combinada, los bits combinados y el tamaño de la matriz deben indicarse antes del nombre de la variable como parte del tipo de datos. El formato definido por el tamaño de la matriz debe ser [msb: lsb], no [tamaño].
Un ejemplo

bit [3:0] [7:0] bytes; //四个字节合并的数组,使用单独的32比特的字来存放。
bytes=32'hCafe_Data;
$display (bytes,,      //显示所有的32比特
bytes[3],,             //最高位字节“CA”
bytes[3][7]);          //最高字节的最高比特位“1”

bit [3:0][7:0] barray[3]; //合并3*32比特
barray[2];               //32比特的数据
barray[2][3];            //8比特的数据
barray[2][3][7];         //单比特的数据

2.3 Arreglos dinámicos
Sabemos que los tipos de arreglos Verilog son todos arreglos de ancho fijo cuyo ancho se determina en tiempo de compilación. Pero si no conocemos el ancho de la matriz de antemano, ¿cómo debemos asignar el ancho de la matriz? Ahora vamos a presentar la matriz dinámica.
Las matrices dinámicas usan el subíndice vacío [] cuando se declaran. La matriz está vacía al principio. Debe usar el nuevo operador [] para asignar espacio y pasar el ancho de la matriz entre corchetes..
Ejemplo 2.17 usando una matriz dinámica

module test_enum();
int dyn[],d2[];					  //声明动态数组

initial
begin
	dyn=new[5]; 					//dyn的宽度为5,分配5个元素
	foreach(dyn[j])
					dyn[j]=j; 		//对元素进行初始化
	d2=dyn;   						 //复制动态数组
	d2[0]=5;   						//修改复制值
	$display("%d %d",dyn[0],d2[0]); //显示数值0,5
	dyn=new[20](dyn);			    //给dyn分配20个整数值并将前五个值进行复制
	$display("%d %d",dyn[3],dyn[19]); //3,0
	dyn=new[100];					//分配100个整数值给dyn,旧值不复存在
	dyn.delete(); 					//删除所有元素
end     
endmodule

2.4 Cola
SystemVerilog introduce una nueva cola de tipo de datos. Al agregar o eliminar elementos en cualquier lugar de una cola, la pérdida de rendimiento de tales operaciones es mucho menor que las matrices dinámicas, porque las matrices dinámicas necesitan asignar nuevas matrices y copiar todos los elementos.
La declaración de la cola es un subíndice [$] con un signo de dólar, y el número de elementos de la cola es de 0 a $. Tenga en cuenta que la constante de la cola (literal) solo tiene llaves y no hay comillas simples al comienzo de la constante de matriz

module test_enum();
	int j=1,
		q2[$]={3,4},      //队列的常量不需要使用单引号'
		q[$]={0,2,5};     //{0,2,5}
	initial
	begin
		j=q2[$];          //j=4     
		j=q2[0];          //j=3
		q.insert(1,1);    //在第1位插入1{0,1,2,5}
		q.insert(2,3);    //在第2位插入3{0,1,3,2,5}
		q.delete(1);      //删除第一位{0,3,2,5}
	//下面的操作执行速度很快
	q.push_front(6);      //最前面插入6{6,0,3,2,5}       
	j=q.pop_back;         //j=5 {6,0,3,2}
	q.push_back(8); 	  //在最后插入8{6,0,3,2,8}
	j=q.pop_front;		  //j=6{0,3,2,8}
	foreach(q[i])
	$display("%0d",q[i]); //打印整个队列
		q.delete(); 	  //等价于命令q={};删除整个队列
	end     
endmodule

Nota: Poner $ en el lado izquierdo de una expresión de rango, luego $ representará el valor mínimo [$: 2] es equivalente a [0: 2], colocando $ en el lado derecho de una expresión de rango, luego $ representará el valor mínimo [1: $] es equivalente a [1: 2].
2.5 Arreglos asociativos
Si solo necesita modelar un procesador con varios rangos de direccionamiento de G-byte. En una prueba típica, este procesador solo puede acceder a cientos o miles de bytes utilizados para almacenar código ejecutable y datos. En este caso, la asignación e inicialización de unos pocos G bytes de espacio de almacenamiento es obviamente Derrochador
El emulador generalmente usa una línea de dirección de 32 bits o datos de 64 bits como paquete de datos indexados. Obviamente, esto tiene un cierto costo adicional.
Las matrices asociativas se declaran colocando tipos de datos entre corchetes

module test_enum();
	bit[63:0] assoc[bit[63:0]],idx=1;   //64个bit[63:0] 关联数组assoc

	repeat(64)  begin  //对1,2,4,8,16等等的稀疏元素进行初始化。
		assoc[idx]=idx;
		idx=idx<<1;
	end

	foreach(assoc[i])   //foreach遍历数组
		$display("assoc[%0d]=%0d",i,assoc[i]);
		if(assoc.first(idx))   //使用函数遍历数组
			begin //得到第一个索引
		do
			$display("assoc[%h]=%h",idx,assoc[idx]);
			while(assoc.next(idx)); //得到下一个索引
	end

	assoc.first(idx);   //找到并删除第一个元素
	assoc.delete(idx); 
	$display("the array now has %0d elements",assoc.num);
end     
endmodule
38 artículos originales publicados · Me gusta 29 · Visitas 10,000+

Supongo que te gusta

Origin blog.csdn.net/weixin_45270982/article/details/96625882
Recomendado
Clasificación