这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 换逻辑分析仪+Verilog存储器和数组元素/函数调用/符号

共3条 1/1 1 跳转至

换逻辑分析仪+Verilog存储器和数组元素/函数调用/符号

工程师
2024-11-01 19:32:01   被打赏 20 分(兑奖)     打赏
存储器和数组元素

在硬件描述语言(Verilog)中,存储器和数组元素的选择是基本操作之一。这些操作允许开发者从存储器或数组中读取或写入数据。


存储器元素选择:存储器元素是指从某个存储器中选取一个字。其语句格式如下:
memory[word_address]

有一个8位宽、64个单元的存储器hdlc_ram,要访问其第60个单元的值,可以写为:

数组元素选择:数组元素选择是指从数组中选择一个字。其格式与存储器元素选择类似:
array[word_address]

有一个16位宽、64个字的存储器fill_pattern,要读取其地址为10的元素的低字节,可以写为:

reg[15:0] fill_pattern[0:63]; // 64个字的存储器,每个字16位  
reg[7:0] test_pattern;  
test_pattern = fill_pattern[10][7:0]; // 从存储器fill_pattern地址为10的元素中读取该字的低字节
部分位选:对于存储器元素或数组元素,还可以进行部分位选。

hdlc_ram[60][2]; // 第60个元素第2位的值(注意:这里假设hdlc_ram的每个元素是位宽大于2的向量)  
hdlc_ram[15][2:4]; // 第15个元素的部分位选在[2:4]位范围内的值
但需要注意的是,部分位选时,所选的位范围必须在元素的有效位宽内。错误的示例:
hdlc_ram[0:2]; // 不允许,非法。因为这是在尝试选择一个或多个存储器单元,而不是单元内的位。

数组的例子:

reg[7:0] sense_data[15:0][15:0]; // 一个二维数组,每个元素8位宽,共有256个元素  
integer three_d[255:0][255:0][255:0]; // 一个三维数组,但这里声明可能有误,因为Verilog中通常不使用这种多维数组的声明方式,或者需要特定的编译器支持。  
wire xbar[...][...]; // xbar数组的声明不完整,需要指定维度和位宽。  
  
// 访问数组的整个元素或特定位  
sense_data[1][1][0]; // 访问数组索引为[1][1]的元素中的0位  
three_d[5][5][2]; // 如果三维数组声明正确,这是访问[5][5][2]位置的元素。  
three_d[2][1:2][8]; // 不允许,因为这是对多维数组进行非法的部分位选。  
xbar[0][2:0]; // 如果xbar是二维数组且声明正确,这是访问第一个元素的低3位。


函数调用在Verilog中,函数调用可以用于表达式中。函数调用可以是系统函数调用(以$字符开头),也可以是用户自定义的函数调用。系统函数调用:
$time // 返回当前仿真时间
用户自定义函数调用:用户可以在Verilog代码中定义自己的函数,并在表达式中调用它们。
function int sum_of_events(int a, int b);  
    sum_of_events = a + b;  
endfunction  
  
// 在表达式中调用用户自定义函数  
int result;  
result = $time + sum_of_events(3, 4); // 假设$time返回了当前仿真时间,sum_of_events计算了两个整数的和。


符号

操作数可以是有符号的,也可以是没有符号的。若某个表达式中的所有操作数全部都是有符号的,则该表达式的结果也是有符号的,否则是无符号的。

8d2 +8'sb0101
4'sb0110-4'sd1

//结果是没有符号的,因为8d2是一个无符号数//结果是有符号的,因为所有的操作数都是有符号数

8d2:这里的8d可能是一个误解或打字错误。在Verilog中,d用于表示十进制数,但前面的数字(如8)通常不用于指定数的位宽或符号性。

如果8d2意图表示一个8位的十进制数2,则正确的表示应该是8'd2(尽管8'd中的8对于字面值2来说是多余的,因为2无论如何都不会超过8位的范围)。

8'd2仍然是一个无符号数,除非特别声明为有符号。Verilog中并没有直接为字面值指定符号性的语法(除了对于二进制字面值可以使用b或sb来区分无符号和有符号)。

假设8d2(或更准确的8'd2)是一个无符号数。8'sb0101:这是一个8位宽的二进制有符号数,其二进制值为0101,转换为十进制是5。


4'sb0110:这是一个4位宽的二进制有符号数,其二进制值为0110,转换为十进制是6。

4'sd1:这里的4'sd同样是一个问题。在Verilog中,d用于表示十进制字面值,但前面的4's并没有意义,因为s不用于十进制字面值来指定符号性(它用于二进制字面值b前面来指定有符号性)。

正确的表示应该是一个十进制字面值(4'd1,但4'是多余的,因为1无论如何都不会超过4位的范围)或者一个二进制有符号字面值(如4'sb0001)。

如果假设4'sd1实际上是指4'd1(即一个4位的十进制数1,但视为有符号,尽管这种表示是不标准的),则可以继续分析。

更准确的表示应该是4'b0001(无符号)或4'sb0001(有符号,但s在这种情况下是多余的,对于二进制字面值,除非特别指定,否则默认为无符号)。


总结:

在Verilog中,存储器和数组元素的选择是基础操作,允许开发者从存储器或数组中读写数据。存储器元素通过指定地址来选择,而数组元素选择格式类似。部分位选允许进一步从元素中选择特定的位。需要注意的是,位选必须在元素的有效位宽内进行,且多维数组的部分位选需遵循规则。Verilog支持系统函数调用和用户自定义函数调用,系统函数以$开头,用户函数则需在代码中定义,两者均可在表达式中调用。这些功能共同构成了Verilog强大的数据处理能力。















专家
2024-11-03 20:15:27     打赏
2楼

感谢分享


专家
2024-11-03 20:34:11     打赏
3楼

感谢分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]