Guia de redação da plataforma de teste de verificação SystemVerilog Capítulo 2 Tipos de dados

2.6 Listas vinculadas O
SystemVerilog fornece estruturas de dados de listas vinculadas, mas deve ser evitado porque as filas fornecidas pelo SystemVerilog são mais eficientes e fáceis de usar.
2.7 Método de
matriz 2.7.1 Método de redução de matriz
O método básico de redução de matriz é reduzir uma matriz a um valor. O método mais usado é somar, além do produto (multiplicação) e (ou) ou (ou) xor (OR exclusivo), etc..
Ao realizar a compactação da matriz, é particularmente importante observar que a largura dos bits é um problema.
Exemplo 2.23 Soma de matrizes

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

No SystemVerilog, $ urandom_range ($ size (array) -1) pode ser usado para selecionar um elemento aleatório para matrizes de largura fixa, filas, matrizes dinâmicas e matrizes associativas e $ urandom_range (array.size ( ) -1).

2.7.2 Método de posicionamento de matrizes
Exemplo 2.25 Método de posicionamento de matrizes 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: item é chamado de parâmetro de repetição, representa um único elemento na matriz, item é o nome padrão, você também pode especificar outro nome. Os quatro casos a seguir são 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);

Quando o método de redução de uma matriz é combinado com a instrução condicional, o resultado do operador soma é o número de vezes que a expressão condicional é verdadeira. Vejamos um exemplo.

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 Organização da matriz O
SystemVerilog possui várias maneiras de alterar a ordem dos elementos em uma matriz.Incluindo sequência reversa, positiva, sequência reversa, aleatória.
Exemplo 2.29 Classificando uma 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 Usando o método de posicionamento da matriz para construir um placar

2.8 Escolhendo tipos de armazenamento
De fato, a escolha dos tipos de dados é multifacetada. Precisamos considerar vários aspectos, como flexibilidade, uso de memória, velocidade, classificação e estrutura de dados. Em nossos aplicativos futuros, entenderemos profundamente cada um Os prós e contras do tipo de dados.

2.9 Use typedef para criar um novo
tipo Defina um novo tipo de dados sobre o tipo de dados original. Para não confundir este livro, todos os tipos definidos pelo usuário têm o sufixo "_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;  //等价的两种方式

A nova definição de matriz não é óbvia. Você precisa colocar o subscrito da matriz no novo nome da matriz.

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

2.10 Criar estrutura definida pelo usuário
No SystemVerilog, introduzimos o conceito de estrutura de dados. Uma estrutura apenas organiza dados juntos, apenas uma coleção de dados.
2.10.1 Crie novos tipos usando struct
struct pode combinar várias variáveis. Representamos uniformemente o novo tipo criado por struct com "_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 Crie uniões que possam acomodar diferentes tipos de uniões
Em geral, diferentes tipos de dados são colocados no mesmo local. Se você precisar ler e escrever frequentemente o mesmo registro em vários formatos diferentes, o consórcio é muito útil. Concordamos em sufocar "_u".

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

2.10.4 Estrutura de mesclagem
Vamos descrever a estrutura compactada para economizar espaço de armazenamento por meio de um exemplo.

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

2.11 Conversão de tipo
2.11.1 Conversão
estática A conversão estática não verifica o valor da conversão. Se cruzar a fronteira, não podemos detectá-lo.
Formato básico de conversão: tipo '(val).
Exemplo 2.41 Conversão estática entre plástico e real

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

2.11.2 Conversão
dinâmica A função de conversão dinâmica $ cast permite a verificação de valores fora dos limites.Se não ultrapassar a fronteira, retorna 1, caso contrário, retorna 0.
2.11.3 Operadores de fluxo
Os operadores de fluxo >> e << são usados ​​para compactar os dados subsequentes em um fluxo de bits. >> é transformar os dados da esquerda para a direita no fluxo de dados, << é transformar os dados da direita para a esquerda no fluxo de dados.
Exemplo 4.42 Operações básicas de fluxo

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 A declaração de tipo enumerado mais simples contém uma lista de nomes de constantes e uma ou mais variáveis.
Use o nome da função interna () para obter a sequência correspondente ao valor da variável de enumeração. Uniformemente usamos o sufixo "_e" para indicar o tipo de dados da enumeração.
2.12.1 Definir o valor da enumeração O valor da
enumeração é padronizado para um número inteiro a partir de 0, e você pode definir o valor da enumeração. Geralmente, quando nos referimos a 0 para a constante de enumeração, podemos evitar alguns erros desnecessários.
2.12.2 Sub-rotinas do tipo de enumeração
(1) first () retornam a primeira variável de enumeração
(2) last () retorna a última variável de enumeração
(3) next () retorna a próxima variável de enumeração
(4) next (N) Retorna a enésima variável de enumeração
(5) anterior () Retorna a variável de enumeração anterior
(6) anterior (N) Retorna a variável de enumeração anterior enésima para
percorrer todos os membros da enumeração (observe o tipo de enumeração Definição de valor)
Quando o cabeçalho ou a cauda da lista constante de enumeração é atingida, as funções next e prev serão automaticamente agrupadas em um anel.
2.12.3 Conversão de tipos enumerados
O tipo padrão de tipo de enumeração é int de dois estados.
A variável de enumeração pode ser atribuída diretamente à variável int por meio de uma expressão de atribuição simples.
Não é permitido atribuir int diretamente a variáveis ​​de enumeração, isso é considerado fora dos limites.
Exemplo 2.51 Atribuição mútua entre tipos inteiro e 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

O resultado:

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

$ cast (color, c) converte dinamicamente o tipo int em um tipo enumerado.Se não houver retorno entre fronteiras, 1 será retornado, caso contrário, será retornado 0; dentro dos limites (0,1,2), 3 já cruzou a borda.
2.13 O
modificador constante de constante é suportado no SystemVerilog, permitindo a inicialização variável quando declarada, mas seu valor não pode ser alterado no código do procedimento.
2.14 String
O tipo de sequência no SystemVerilog pode ser usado para salvar sequências de comprimento variável. Um único byte é do tipo byte. As cadeias usam armazenamento dinâmico, portanto, não se preocupe com a falta de espaço de armazenamento.
Exemplo 2.53 Método String

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) retorna o byte na posição N
tolower () retorna uma string em minúsculas
putc (M, C) grava o byte C no bit M da string, M deve estar entre 0 e len Entre comprimentos.
substr (start, end), leia todos os caracteres da posição do início ao fim.

Publicado 38 artigos originais · Gosto 29 · Visita 10.000+

Acho que você gosta

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