在硬件描述语言(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位。
$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强大的数据处理能力。