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

2.6 Listas vinculadas
SystemVerilog proporciona estructuras de datos de listas vinculadas, pero debe evitarse porque las colas proporcionadas por SystemVerilog son más eficientes y fáciles de usar.
2.7 Método de
matriz 2.7.1 Método de reducción de matriz
El método básico de reducción de matriz es reducir una matriz a un valor. El método más utilizado es sumar, además del producto (multiplicación) y (o) o (o) xor (OR exclusivo), etc..
Al realizar la compresión de matriz, es particularmente importante tener en cuenta que el ancho de bits es un problema.
Ejemplo 2.23 Suma de matrices

module test_enum();
bit on[10]; //单比特数组
int total;
initial begin                 
foreach(on[i]) 
on[i]=i; //on[i]的值为0或1
$display("on.sum=%0d",on.sum);  //on.sum是单比特无符号的数 打印出单比特和 on.sum=1
$display("on.sum=%0d",on.sum+32'd0);  //on.sum是32比特数 打印出32比特和 on.sum=5
//由于total是32比特变量,所以数组的和也是32比特变量
total=on.sum;
$display ("total=%0d",total); //total=5
//将数组和一个32比特数进行比较
if (on.sum>=32'd5) //条件成立
$display ("sum has 5 or more 1's'');
//使用带32比特有符号运算的with表达式
$display("int sum=%0d",on.sum with (int'(item))); //利用with来限定on.sum的数据类型,这是一种比较好用的方式
end     
endmodule

En SystemVerilog, $ urandom_range ($ size (array) -1) se puede usar para seleccionar un elemento aleatorio para matrices de ancho fijo, colas, matrices dinámicas y matrices asociativas, y $ urandom_range (array.size ( ) -1).

2.7.2 Método de posicionamiento de matriz
Ejemplo 2.25 Método de posicionamiento de matriz min, max, unique, find

module test_enum();
int f[6]={1,6,2,6,8,6},
d[]='{2,4,6,8,10},
q[$ ]={1,3,5,7},
tq[$];
initial
begin                 
tq=q.min();     //求最小值{1}
foreach(tq[i])
$display("min:tq[%0d]=%0d",i,tq[i]);
tq=q.max();    //求最大值{7}
foreach(tq[i])
$display("max:tq[%0d]=%0d",i,tq[i]);
        
tq=f.unique();   //求数组中唯一值的队列
foreach(tq[i])
$display("unique:tq[%0d]=%0d",i,tq[i]);
        
tq=d.find with (item>3);  //利用find函数做操作
foreach(tq[i])
$display("find:tq[%0d]=%0d",i,tq[i]);
tq.delete();     //等价的操作
foreach(d[i])
if(d[i]>3)
tq.push_back(d[i]);
foreach(tq[i])
$display("tq[%0d]=%0d",i,tq[i]);
        
tq=d.find_index with (item>3);  //输出的是index索引也就是第几位的值
foreach(tq[i])
$display("tq[%0d]=%0d",i,tq[i]);  
end     
endmodule

Nota: el elemento se llama parámetro repetitivo, representa un único elemento en la matriz, el elemento es el nombre predeterminado, también puede especificar otro nombre. Los siguientes cuatro casos son equivalentes.

 tq=d.find_first with (item= =4);
 tq=d.find_first() with (item= =4);
 tq=d.find_first(item) with (item= =4);
 tq=d.find_first(x) with (x==4);

Cuando el método de reducción de una matriz se combina con la instrucción condicional, el resultado del operador de suma es el número de veces que la expresión condicional es verdadera. Veamos un ejemplo.

module test_enum();
	int count,
	total,
	d[]='{9,1,8,3,4,4};
	initial
	begin                 
	count=d.sum with (item>7);  //比较表达式返回0或1
	total=d.sum with ((item>7)*item);
	$display("count=%0d total=%0d",count,total);  //2,17 

	count=d.sum with (item<8);
	total=d.sum with (item<8?item:0);
	$display("count=%0d total=%0d",count,total);//4,12
	count=d.sum with (item==4);
	$display("count=%0d",count); //2
	end     
endmodule

2.7.3 Disposición de la matriz
SystemVerilog tiene varias formas de cambiar el orden de los elementos en una matriz.Incluyendo inversa, secuencia positiva, secuencia inversa, aleatorio.
Ejemplo 2.29 Ordenar una matriz

 int d[]='{9,1,8,3,4,4};
 d.reverse(); //反向'{4,4,3,8,1,9}
 d.sort();    //正序{1,3,4,4,8,9}
 d.rsort();   //逆序'{9,8,4,4,3,1}
 d.shuffle(); //随机'{9,4,3,8,1,4}

2.7.4 Usar el método de posicionamiento de matriz para construir un marcador

2.8 Elección de los tipos de almacenamiento
De hecho, la elección de los tipos de datos es multifacética. Debemos considerar varios aspectos, como la flexibilidad, el uso de la memoria, la velocidad, la clasificación y la estructura de los datos. Los pros y los contras del tipo de datos.

2.9 Use typedef para crear un nuevo
tipo Defina un nuevo tipo de datos sobre el tipo de datos original. Para no confundir este libro, todos los tipos definidos por el usuario tienen el sufijo "_t".

 parameter opsize=8;
 typedef reg[opsize-1:0] opreg_t;
 opreg_t op_a,op_b;

 typedef bit[31:0] uint;
 typedef int unsigned uint;  //等价的两种方式

La nueva definición de matriz no es obvia. Debe poner el subíndice de la matriz en el nuevo nombre de la matriz.

typedef int fixed_array5[5];
fixed_array5 f5;
initial
begin
	foreach(f5[i])
		f5[i]=i;
end

2.10 Crear estructura definida por el usuario
En SystemVerilog, presentamos el concepto de estructura de datos. Una estructura solo organiza los datos juntos, solo una colección de datos.
2.10.1 Crear nuevos tipos usando struct
struct puede combinar varias variables juntas. Representamos uniformemente el nuevo tipo creado por struct con "_s".

typedef struct{bit[7:0] r, g,b;} pixel_s;
pixel_s my_pixel;

initial 
begin
	typedef struct {int a,
					byte b,
					shortint c;} my_struct_s;
	my_struct_s st='{32'haaaaaaaa,
					8'hbb,
					16'hcccc};
	$display("st=%x %x %x",st.a,st.b,st.c);
end

2.10.3 Crear uniones que puedan acomodar diferentes tipos de uniones
En términos generales, se colocan diferentes tipos de datos en la misma ubicación. Si necesita leer y escribir con frecuencia el mismo registro en varios formatos diferentes, el consorcio es muy útil. Acordamos sufijo "_u".

typedef union { int i; real f;} num_u;
num_u un;
un.f=0.0; //把数值设为浮点形式

2.10.4 Estructura de fusión Describamos la estructura
empaquetada para ahorrar espacio de almacenamiento a través de un ejemplo.

typedef struct packed {bit [7:0] r,g,b} pixel_p_s;
pixel_p_s my_pixel;

2.11 Conversión de tipo
2.11.1 Conversión
estática La conversión estática no verifica el valor de conversión. Si cruza la frontera, no podemos detectarlo.
Formato de conversión básico: tipo '(val).
Ejemplo 2.41 Conversión estática entre plástico y real.

int i;
real r;
i=int '(10.0-0.1); //转换是非强制的
r=real '(42);      //转换是非强制的

2.11.2 Conversión
dinámica La función de conversión dinámica $ cast permite la verificación de valores fuera de límites. Si no cruza el límite, devuelve 1, de lo contrario devuelve 0.
2.11.3 Operadores de flujo
Los operadores de flujo >> y << se utilizan para empaquetar los datos posteriores en un flujo de bits. >> es convertir los datos de izquierda a derecha en la secuencia de datos, << es convertir los datos de derecha a izquierda en la secuencia de datos.
Ejemplo 4.42 Operaciones básicas de flujo

initial
begin
	int h;
	bit [7:0] b,
	g[4],
	j[4]='{8'ha,8'hb,8'hc,8'hd};
	bit [7:0] q,r,s,t;

	h={>>{j}};             //0a0b0c0d把数组打包成整型
	h={<<{j}};             //b030d050位倒序
	h={<<byte{j}};         //0d0c0b0a字节倒序
	b={<<{8'b0011_0101}};  //10101100位倒序
	b={<<4 {8'b0011_0101}};//0101_0011半字节倒序
	{>>{q,r,s,t}}=j;       //将j分散到四个字节变量里
	h={>>{t,s,r,q}};       //将四个字节集中到h里
end

2.12 Tipos
enumerados La declaración de tipo enumerado más simple contiene una lista de nombres constantes y una o más variables.
Use el nombre de la función incorporada () para obtener la cadena correspondiente al valor de la variable de enumeración. Usamos uniformemente el sufijo "_e" para indicar el tipo de datos de la enumeración.
2.12.1 Definir el valor de enumeración El valor de
enumeración se establece de manera predeterminada en un número entero que comienza en 0, y usted mismo puede definir el valor de enumeración. Por lo general, cuando nos referimos a 0 para la constante de enumeración, podemos evitar algunos errores innecesarios.
2.12.2 Subrutinas del tipo de enumeración
(1) first () devuelve la primera variable de enumeración
(2) last () devuelve la última variable de enumeración
(3) next () devuelve la siguiente variable de enumeración
(4) next (N) Devuelve la enésima variable de enumeración
(5) anterior () Devuelve la variable de enumeración anterior
(6) anterior (N) Devuelve la enésima variable de enumeración anterior para
recorrer todos los miembros de enumeración (tenga en cuenta el tipo de enumeración Definición del valor)
Cuando se alcanza el encabezado o la cola de la lista constante de enumeración, las funciones next y prev se ajustarán automáticamente de manera circular.
2.12.3 Conversión de tipos enumerados
El tipo predeterminado de tipo de enumeración es int de dos estados.
La variable de enumeración se puede asignar directamente a la variable int a través de una expresión de asignación simple.
No está permitido asignar int directamente a las variables de enumeración, esto está fuera de consideración por fuera de los límites.
Ejemplo 2.51 Asignación mutua entre enteros y tipos enumerados

module test_enum();
typedef enum {RED,BLUE,GREEN} COLOR_E;
COLOR_E color,c2;
int c;

initial
begin                 
	color=BLUE; //赋一个已知的合法值
	c=color; //将枚举类型转换成整型
	c++; //整型递增
	if(!$ cast(color,c)) //将整型显示转换回枚举类型
	$ display("cast failed for c=%0d",c);
	$ display("color is %0d/%s",color,color.name);
	c++; //对于枚举类型已经越界
	c2=COLOR_E'(c); //不做类型检查
	$ display("c2 is %0d/%s",c2,c2.name);
	if(!$ cast(color,c))
	$display("cast failed for c=%0d",c);
	end
endmodule

El resultado:

 #color is 2/GREEN
 #c2 is 3/
 #cast failed for c=3

$ cast (color, c) convierte dinámicamente el tipo int a un tipo enumerado. Si no hay retorno transfronterizo, se devuelve 1, de lo contrario se devuelve 0; dentro de los límites (0,1,2), 3 ya ha cruzado el borde.
2.13 El
modificador de constante constante es compatible con SystemVerilog, lo que permite la inicialización de variables cuando se declara, pero su valor no se puede cambiar en el código de procedimiento.
2.14 Cadena
El tipo de cadena en SystemVerilog se puede usar para guardar cadenas de longitud variable. Un solo byte es de tipo byte. Las cadenas usan almacenamiento dinámico, así que no se preocupe por quedarse sin espacio de almacenamiento.
Ejemplo 2.53 Método de cadena

module test_enum();
string s;

initial
begin                 
	s="IEEE ";
	$display(s.getc(0));//显示:73('I')
	$display(s.tolower()); //显示:ieee

	s.putc(s.len()-1,"-"); //将空格变为'-'
	s={s,"P1800"}; //“IEEE-P1800”

	$ display(s.substr(2,5));    //显示:EE-P
	//创建临时字符串,注意格式
	my_log($psprintf("%s %5d",s,42));
end

	task my_log (string message);
	//把信息打印到日志里
	$ display("@%0t:%s",$time, message);
	endtask
endmodule

getc (N) devuelve el byte en la posición N
tolower () devuelve una cadena en minúsculas
putc (M, C) escribe el byte C en el bit M de la cadena, M debe estar entre 0 y len Entre largos.
substr (inicio, fin), lee todos los caracteres desde la posición de inicio a fin.

38 artículos originales publicados · Me gusta 29 · Visitas 10,000+

Supongo que te gusta

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