简述
在verilog中读写数据是,数据存储的顺序非常重要,即,对于单个数据,high significant的byte是放在存储器的高地址还是低地址上,就是通常所说的big endian和little endian的问题。
不论是在硬件设计还是硬件验证中,只要设计读写文件的操作,都应该考虑这个问题。
系统函数数据读写顺序
$fread函数
这里只描述$fread函数读取二进制文件的情形,在读取二进制文件的时候,数据存储的顺序非常重要,在读取二进制的数据时,fread函数一次性读取一次性读取32-bit的数据,fread函数要把读取的数据放到程序的某个寄存器或者寄存器组中,如果寄存器的数据长度大于32-bit,那么fread函数会把首先读取到的数据放到寄存器的高位上,如下如所示:
在把寄存器的值移入到别的寄存器组中就要注意,寄存器的high significant的值要对应到寄存器组中的地位地址中。对于如果在某一个时钟读入的数据没有把寄存器填满,要记得寄存器中high significant位置的数据才是有效数据。$fwrite
fwrite写入二进制的数据的顺序正好和fread过程相反,fwrite是程序中寄存器中的值写入到二进制文件当中,寄存器的high significant的值会首先被写入到二进制文件的低地址中。$fseek
fseek是对文件进行重新定位,对于fseek有两点要注意:fseek一定要带返回值,这一点我也是摸索了很长时间才发现,在vcs编译器下,如果fseek不带返回值,会一直编译不过去。
fseek定位以byte为单位,重定位中的偏移值都是表示偏移了多少多少byte。
后续待补充。