新学verilog提小白问题,关于readmem
时间:12-11
整理:3721RD
点击:
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 17:51:10 2008) 提到:
刚开始学,遇到个问题。
我拿到别人的code本来是这样的:
reg [7:0] byte_rd_in;
file = $fopenr(xxx.vec);
$fscanf(file,"%x",byte_rd_in);
文件xxx.vec里面大概是类似这样的内容:
00
01 01 64 00
01 a0 0f
……
现在我因为没有办法用modelsim要把他的程序改成verilog可以用的,于是我改成这样:
file = $fopen(xxx.vec);
$readmemh(file,byte_rd_in);
但是现在出现错误:
Illegal arguments for $readmemh system task
……
请达人们指教一下到底怎么回事。
谢谢
☆─────────────────────────────────────☆
jovylin (阳光天堂@祭奠,黄金一代) 于 (Tue Jun 10 18:30:36 2008) 提到:
你把 reg [7:0] byte_rd_in;
换成reg [7:0] byte_rd_in[1:256];
试试
【 在 feynman (费曼) 的大作中提到: 】
: 刚开始学,遇到个问题。
: 我拿到别人的code本来是这样的:
: reg [7:0] byte_rd_in;
: ...................
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 20:13:41 2008) 提到:
load_memory_tasks:
$readmemh ("file_name ",memory_name[,start_addr[,finish_addr]]);
Example:
reg [7:0] mem[1:256];
/*Given this declaration,each of the following statements load data into mem in a different manner*/
initial $readmemh("mem.data", mem);
initial $readmemh("mem.data", mem, 16);
initial $readmemh("mem.data", mem, 128, 1);
【 在 feynman (费曼) 的大作中提到: 】
: 刚开始学,遇到个问题。
: 我拿到别人的code本来是这样的:
: reg [7:0] byte_rd_in;
: ...................
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 20:34:02 2008) 提到:
这个,是openbook里的内容,我看过了
只是不太明白后面这个[1:256]到底是干吗的,一定要吗?
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: load_memory_tasks:
: $readmemh ("file_name ",memory_name[,start_addr[,finish_addr]]);
: Example:
: ...................
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 21:36:22 2008) 提到:
1:256定义了256个变量,每个是8位(7:0)
【 在 feynman (费曼) 的大作中提到: 】
: 这个,是openbook里的内容,我看过了
: 只是不太明白后面这个[1:256]到底是干吗的,一定要吗?
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 22:06:35 2008) 提到:
前面的[N-1,0]是data的位宽,后面的[M-1,0]是data的深度
也就是说这是个N×M的ram
【 在 feynman (费曼) 的大作中提到: 】
: 这个,是openbook里的内容,我看过了
: 只是不太明白后面这个[1:256]到底是干吗的,一定要吗?
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 22:33:48 2008) 提到:
哦,可是为什么一定要有这个深度才行呢?
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 前面的[N-1,0]是data的位宽,后面的[M-1,0]是data的深度
: 也就是说这是个N×M的ram
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 22:35:50 2008) 提到:
没有这个深度你只能读上来一个N位的数据啊
【 在 feynman (费曼) 的大作中提到: 】
: 哦,可是为什么一定要有这个深度才行呢?
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 22:40:11 2008) 提到:
但是我至少能读出来一个啊
至少应该有一句是对的啊,为什么我所有的readmemh语句都报错呢?有几句就报几个错
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 没有这个深度你只能读上来一个N位的数据啊
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 22:52:41 2008) 提到:
其实后面的[M-1,0]的M-1和0是起始/终止地址,可能语法规定不能相同吧。
一个N位寄存器就相当于起始终止地址相同的ram?好像还是不一样的吧,这个我也不太清楚...
【 在 feynman (费曼) 的大作中提到: 】
: 但是我至少能读出来一个啊
: 至少应该有一句是对的啊,为什么我所有的readmemh语句都报错呢?有几句就报几个错
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 22:56:34 2008) 提到:
嗯,不相同
systemverilog里面引入了pack和unpack来表示这个差别
reg[7:0] A;//一个变量
reg A [7:0];//等于8个变量
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 其实后面的[M-1,0]的M-1和0是起始/终止地址,可能语法规定不能相同吧。
: 一个N位寄存器就相当于起始终止地址相同的ram?好像还是不一样的吧,这个我也不太清楚...
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 23:09:14 2008) 提到:
噢,也就是说lz没有写后面的[],其实是声明了一个寄存器,而不是ram
而$readmemh函数是对ram来操作的。
如果声明成只有一个地址的ram的话,就应该能够读出一个数了吧
【 在 No6 (No6) 的大作中提到: 】
: 嗯,不相同
: systemverilog里面引入了pack和unpack来表示这个差别
: reg[7:0] A;//一个变量
: ...................
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:10:48 2008) 提到:
哦,这样啊
明白了,明天去试试
谢谢大家
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 噢,也就是说lz没有写后面的[],其实是声明了一个寄存器,而不是ram
: 而$readmemh函数是对ram来操作的。
: 如果声明成只有一个地址的ram的话,就应该能够读出一个数了吧
: ...................
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:12:12 2008) 提到:
如果只有一位还用得到readmemb么?
这个函数设计的初衷不是这么用的吧
所以出现什么情况都正常
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 噢,也就是说lz没有写后面的[],其实是声明了一个寄存器,而不是ram
: 而$readmemh函数是对ram来操作的。
: 如果声明成只有一个地址的ram的话,就应该能够读出一个数了吧
: ...................
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 23:14:48 2008) 提到:
呵呵,咱们讨论的是corner case,讨论讨论挺有意思的
【 在 No6 (No6) 的大作中提到: 】
: 如果只有一位还用得到readmemb么?
: 这个函数设计的初衷不是这么用的吧
: 所以出现什么情况都正常
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:37:08 2008) 提到:
唉,别光讨论啊,教教我
我还是看得云里雾里
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 呵呵,咱们讨论的是corner case,讨论讨论挺有意思的
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:39:01 2008) 提到:
你照搬着用就行了啊
不用想那么多:)
【 在 feynman (费曼) 的大作中提到: 】
: 唉,别光讨论啊,教教我
: 我还是看得云里雾里
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:40:19 2008) 提到:
那,我一定要[1:256]吗?
少点要紧吗?
【 在 No6 (No6) 的大作中提到: 】
: 你照搬着用就行了啊
: 不用想那么多:)
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:44:26 2008) 提到:
可以啊,多少都行
那就是一个范围,而且可以写成m:n
m和n是两正数,不分大小
把m和n都省略了或者设成相等没试过,也没必要
【 在 feynman (费曼) 的大作中提到: 】
: 那,我一定要[1:256]吗?
: 少点要紧吗?
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:51:03 2008) 提到:
那我再问一下,我读到byte_rd_in中的时候,是依次的吗?
比方说,是不是第一次读读到byte_rd_in[1]里,第二次再执行同一句readmemh就读到
byte_rd_in[2]中了呢?
在紧接着readmemh语句后,我还有把byte_rd_in赋值到另一个变量中,这个我需要在后面加[n]指明用哪个来赋值吗?
【 在 No6 (No6) 的大作中提到: 】
: 可以啊,多少都行
: 那就是一个范围,而且可以写成m:n
: m和n是两正数,不分大小
: ...................
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:52:12 2008) 提到:
readmemh是一次把file里面的数据读到变量(byte_rd_in[m:n])里面的
【 在 feynman (费曼) 的大作中提到: 】
: 那我再问一下,我读到byte_rd_in中的时候,是依次的吗?
: 比方说,是不是第一次读读到byte_rd_in[1]里,第二次再执行同一句readmemh就读到
: byte_rd_in[2]中了呢?
: ...................
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:53:27 2008) 提到:
哦,我明白了
就是说这个和原来的$fscanf是不一样的方式,我不能读一句赋一句值是吧?
【 在 No6 (No6) 的大作中提到: 】
: readmemh是一次把file里面的数据读到变量(byte_rd_in[m:n])里面的
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:54:45 2008) 提到:
fscanf这个函数没用过
不清楚是不是verilog标准里面的,还是哪个tools提供的
【 在 feynman (费曼) 的大作中提到: 】
: 哦,我明白了
: 就是说这个和原来的$fscanf是不一样的方式,我不能读一句赋一句值是吧?
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:57:04 2008) 提到:
不是verilog里的,是modelsim里的,所以我才要把他转化到verilog可以用的形式
据说和c里面的fscan差不多
【 在 No6 (No6) 的大作中提到: 】
: fscanf这个函数没用过
: 不清楚是不是verilog标准里面的,还是哪个tools提供的
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:59:30 2008) 提到:
PDF] ModelSim User's Manual文件格式: PDF/Adobe Acrobat
The ModelSim User’s Manual focuses primarily on the GUI mode of operation. ...... $fscanf. $readmemh. $fdisplayo. $fseek. $rewind. $feof. $fstrobe ...
www.actel.com/documents/modelsim_ug.pdf - 类似网页 - 加入笔记本
好像还真是
一般情况下用不到这些file函数,只需要一读一写,其它的靠脚本搞定了,我的做法
【 在 feynman (费曼) 的大作中提到: 】
: 不是verilog里的,是modelsim里的,所以我才要把他转化到verilog可以用的形式
: 据说和c里面的fscan差不多
feynman (费曼) 于 (Tue Jun 10 17:51:10 2008) 提到:
刚开始学,遇到个问题。
我拿到别人的code本来是这样的:
reg [7:0] byte_rd_in;
file = $fopenr(xxx.vec);
$fscanf(file,"%x",byte_rd_in);
文件xxx.vec里面大概是类似这样的内容:
00
01 01 64 00
01 a0 0f
……
现在我因为没有办法用modelsim要把他的程序改成verilog可以用的,于是我改成这样:
file = $fopen(xxx.vec);
$readmemh(file,byte_rd_in);
但是现在出现错误:
Illegal arguments for $readmemh system task
……
请达人们指教一下到底怎么回事。
谢谢
☆─────────────────────────────────────☆
jovylin (阳光天堂@祭奠,黄金一代) 于 (Tue Jun 10 18:30:36 2008) 提到:
你把 reg [7:0] byte_rd_in;
换成reg [7:0] byte_rd_in[1:256];
试试
【 在 feynman (费曼) 的大作中提到: 】
: 刚开始学,遇到个问题。
: 我拿到别人的code本来是这样的:
: reg [7:0] byte_rd_in;
: ...................
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 20:13:41 2008) 提到:
load_memory_tasks:
$readmemh ("file_name ",memory_name[,start_addr[,finish_addr]]);
Example:
reg [7:0] mem[1:256];
/*Given this declaration,each of the following statements load data into mem in a different manner*/
initial $readmemh("mem.data", mem);
initial $readmemh("mem.data", mem, 16);
initial $readmemh("mem.data", mem, 128, 1);
【 在 feynman (费曼) 的大作中提到: 】
: 刚开始学,遇到个问题。
: 我拿到别人的code本来是这样的:
: reg [7:0] byte_rd_in;
: ...................
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 20:34:02 2008) 提到:
这个,是openbook里的内容,我看过了
只是不太明白后面这个[1:256]到底是干吗的,一定要吗?
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: load_memory_tasks:
: $readmemh ("file_name ",memory_name[,start_addr[,finish_addr]]);
: Example:
: ...................
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 21:36:22 2008) 提到:
1:256定义了256个变量,每个是8位(7:0)
【 在 feynman (费曼) 的大作中提到: 】
: 这个,是openbook里的内容,我看过了
: 只是不太明白后面这个[1:256]到底是干吗的,一定要吗?
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 22:06:35 2008) 提到:
前面的[N-1,0]是data的位宽,后面的[M-1,0]是data的深度
也就是说这是个N×M的ram
【 在 feynman (费曼) 的大作中提到: 】
: 这个,是openbook里的内容,我看过了
: 只是不太明白后面这个[1:256]到底是干吗的,一定要吗?
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 22:33:48 2008) 提到:
哦,可是为什么一定要有这个深度才行呢?
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 前面的[N-1,0]是data的位宽,后面的[M-1,0]是data的深度
: 也就是说这是个N×M的ram
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 22:35:50 2008) 提到:
没有这个深度你只能读上来一个N位的数据啊
【 在 feynman (费曼) 的大作中提到: 】
: 哦,可是为什么一定要有这个深度才行呢?
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 22:40:11 2008) 提到:
但是我至少能读出来一个啊
至少应该有一句是对的啊,为什么我所有的readmemh语句都报错呢?有几句就报几个错
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 没有这个深度你只能读上来一个N位的数据啊
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 22:52:41 2008) 提到:
其实后面的[M-1,0]的M-1和0是起始/终止地址,可能语法规定不能相同吧。
一个N位寄存器就相当于起始终止地址相同的ram?好像还是不一样的吧,这个我也不太清楚...
【 在 feynman (费曼) 的大作中提到: 】
: 但是我至少能读出来一个啊
: 至少应该有一句是对的啊,为什么我所有的readmemh语句都报错呢?有几句就报几个错
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 22:56:34 2008) 提到:
嗯,不相同
systemverilog里面引入了pack和unpack来表示这个差别
reg[7:0] A;//一个变量
reg A [7:0];//等于8个变量
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 其实后面的[M-1,0]的M-1和0是起始/终止地址,可能语法规定不能相同吧。
: 一个N位寄存器就相当于起始终止地址相同的ram?好像还是不一样的吧,这个我也不太清楚...
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 23:09:14 2008) 提到:
噢,也就是说lz没有写后面的[],其实是声明了一个寄存器,而不是ram
而$readmemh函数是对ram来操作的。
如果声明成只有一个地址的ram的话,就应该能够读出一个数了吧
【 在 No6 (No6) 的大作中提到: 】
: 嗯,不相同
: systemverilog里面引入了pack和unpack来表示这个差别
: reg[7:0] A;//一个变量
: ...................
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:10:48 2008) 提到:
哦,这样啊
明白了,明天去试试
谢谢大家
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 噢,也就是说lz没有写后面的[],其实是声明了一个寄存器,而不是ram
: 而$readmemh函数是对ram来操作的。
: 如果声明成只有一个地址的ram的话,就应该能够读出一个数了吧
: ...................
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:12:12 2008) 提到:
如果只有一位还用得到readmemb么?
这个函数设计的初衷不是这么用的吧
所以出现什么情况都正常
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 噢,也就是说lz没有写后面的[],其实是声明了一个寄存器,而不是ram
: 而$readmemh函数是对ram来操作的。
: 如果声明成只有一个地址的ram的话,就应该能够读出一个数了吧
: ...................
☆─────────────────────────────────────☆
BourneJason (~最爱DOTA~) 于 (Tue Jun 10 23:14:48 2008) 提到:
呵呵,咱们讨论的是corner case,讨论讨论挺有意思的
【 在 No6 (No6) 的大作中提到: 】
: 如果只有一位还用得到readmemb么?
: 这个函数设计的初衷不是这么用的吧
: 所以出现什么情况都正常
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:37:08 2008) 提到:
唉,别光讨论啊,教教我
我还是看得云里雾里
【 在 BourneJason (~最爱DOTA~) 的大作中提到: 】
: 呵呵,咱们讨论的是corner case,讨论讨论挺有意思的
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:39:01 2008) 提到:
你照搬着用就行了啊
不用想那么多:)
【 在 feynman (费曼) 的大作中提到: 】
: 唉,别光讨论啊,教教我
: 我还是看得云里雾里
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:40:19 2008) 提到:
那,我一定要[1:256]吗?
少点要紧吗?
【 在 No6 (No6) 的大作中提到: 】
: 你照搬着用就行了啊
: 不用想那么多:)
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:44:26 2008) 提到:
可以啊,多少都行
那就是一个范围,而且可以写成m:n
m和n是两正数,不分大小
把m和n都省略了或者设成相等没试过,也没必要
【 在 feynman (费曼) 的大作中提到: 】
: 那,我一定要[1:256]吗?
: 少点要紧吗?
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:51:03 2008) 提到:
那我再问一下,我读到byte_rd_in中的时候,是依次的吗?
比方说,是不是第一次读读到byte_rd_in[1]里,第二次再执行同一句readmemh就读到
byte_rd_in[2]中了呢?
在紧接着readmemh语句后,我还有把byte_rd_in赋值到另一个变量中,这个我需要在后面加[n]指明用哪个来赋值吗?
【 在 No6 (No6) 的大作中提到: 】
: 可以啊,多少都行
: 那就是一个范围,而且可以写成m:n
: m和n是两正数,不分大小
: ...................
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:52:12 2008) 提到:
readmemh是一次把file里面的数据读到变量(byte_rd_in[m:n])里面的
【 在 feynman (费曼) 的大作中提到: 】
: 那我再问一下,我读到byte_rd_in中的时候,是依次的吗?
: 比方说,是不是第一次读读到byte_rd_in[1]里,第二次再执行同一句readmemh就读到
: byte_rd_in[2]中了呢?
: ...................
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:53:27 2008) 提到:
哦,我明白了
就是说这个和原来的$fscanf是不一样的方式,我不能读一句赋一句值是吧?
【 在 No6 (No6) 的大作中提到: 】
: readmemh是一次把file里面的数据读到变量(byte_rd_in[m:n])里面的
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:54:45 2008) 提到:
fscanf这个函数没用过
不清楚是不是verilog标准里面的,还是哪个tools提供的
【 在 feynman (费曼) 的大作中提到: 】
: 哦,我明白了
: 就是说这个和原来的$fscanf是不一样的方式,我不能读一句赋一句值是吧?
☆─────────────────────────────────────☆
feynman (费曼) 于 (Tue Jun 10 23:57:04 2008) 提到:
不是verilog里的,是modelsim里的,所以我才要把他转化到verilog可以用的形式
据说和c里面的fscan差不多
【 在 No6 (No6) 的大作中提到: 】
: fscanf这个函数没用过
: 不清楚是不是verilog标准里面的,还是哪个tools提供的
☆─────────────────────────────────────☆
No6 (No6) 于 (Tue Jun 10 23:59:30 2008) 提到:
PDF] ModelSim User's Manual文件格式: PDF/Adobe Acrobat
The ModelSim User’s Manual focuses primarily on the GUI mode of operation. ...... $fscanf. $readmemh. $fdisplayo. $fseek. $rewind. $feof. $fstrobe ...
www.actel.com/documents/modelsim_ug.pdf - 类似网页 - 加入笔记本
好像还真是
一般情况下用不到这些file函数,只需要一读一写,其它的靠脚本搞定了,我的做法
【 在 feynman (费曼) 的大作中提到: 】
: 不是verilog里的,是modelsim里的,所以我才要把他转化到verilog可以用的形式
: 据说和c里面的fscan差不多