返回信息流简单写一下代码:
///////////////////////////////////////////
//顶层模块
module top(XXX)
genvar i;
generate
for(i=0;i<XX;i=i+1)
begin:sub
submod submod_inst(XXX)//例化子模块
end
endgenerate
`include "rom_cfg.rmi"//子模块中的rom的初始化文件
endmodule
////////////////////////////////////
//子模块
module submod (XXX)
ROM256X1 rom_inst(.addr(rom_addr),.data(rom_data));
endmodule
////////////////////////////////////
//rom_cfg.rmi
defparam sub[0].submod_inst.rom_inst.INIT=256'bXXXXX...
defparam sub[1].submod_inst.rom_inst.INIT=256'bXXXXX...
...
///////////////////////////////////////////////
rom使用的是xilinx的原语,这样就能比较方便的更改rom中的初始值了,我是这么设想的。我进行的功能仿真(icarus verilog),没什么问题,每个rom中的数据不一样,但是我用ISE编译综合,下载到板子里,用chipscope去抓数据,发现每个rom中的数据是一样的。。。且和第一个一样。
到google去搜都不知道怎么描述这个问题,不知道我哪出了差错?不知道有没有人遇到过这样的问题,给支个招~谢谢拉~
--------------------------------------
***************************************************
我找到了问题出在哪,但是不明白原因...
我写了个测试的例子,结构和上面稍微有点不一样, 有三个层次test_rom,midmod,submod,
其中test_rom中用generate和for语句例化两个midmod,每个midmod里面例化一个submod,
每个submod中用generate和for语句例化两个ROM256X1。伪代码如下:
///////////////////////////////////////////
//顶层模块
module test_rom(XXX)
...
midmod midmod_inst(XXX)
//`include "rom1.cfg" //初始化文件
...
endmodule
////////////////////////////////////////////
//中间层模块
module midmod(XXX)
...
genvar i;
generate
for(i=0;i<2;i=i+1)
begin:sub
submod submod_inst(XXX)//例化子模块
end
endgenerate
...
`include "rom2.cfg"//初始化文件
endmodule
////////////////////////////////////
//子模块
module submod (XXX)
generate
for(i=0;i<2;i=i+1)
begin:rom
ROM256X1 rom_inst(.addr(rom_addr),.data(rom_data[i]));
end
endgenerate
endmodule
////////////////////////////////////
rom的配置文件有两个rom1.cfg和rom2.cfg,它们的内容基本一样,只是一个是放在test_rom
模块中的,一个是放在midmod模块中的。
rom1.cfg:
defparam midmod_inst.sub[0].submod_inst.rom[0].rom_inst.INIT=256'b0XXXXXXXXXXXXXXXXXXX...
defparam midmod_inst.sub[0].submod_inst.rom[1].rom_inst.INIT=256'b0XXXXXXXXXXXXXXXXXXX...
defparam midmod_inst.sub[1].submod_inst.rom[0].rom_inst.INIT=256'b0XXXXXXXXXXXXXXXXXXX...
defparam midmod_inst.sub[1].submod_inst.rom[1].rom_inst.INIT=256'b0XXXXXXXXXXXXXXXXXXX..
rom2.cfg:
defparam sub[0].submod_inst.rom[0].rom_inst.INIT=256'b0XXXXXXXXXXXXXXXXXXX..
defparam sub[0].submod_inst.rom[1].rom_inst.INIT=256'b0XXXXXXXXXXXXXXXXXXX..
defparam sub[1].submod_inst.rom[0].rom_inst.INIT=256'b0XXXXXXXXXXXXXXXXXXX.
defparam sub[1].submod_inst.rom[1].rom_inst.INIT=256'b0XXXXXXXXXXXXXXXXXXX.
然后在ISE12上做两个实验:
1.注释掉midmod中的include语句,而保留test_rom中的include,综合的结果中有下面输出(test_rom.syr中找)
Analyzing module <submod.1> in library <work>.
Module <submod.1> is correct for synthesis.
Set user-defined property "INIT = 000000000000000000007C88E260C5308343C6E3F494DB0F8BF0B6DFA25DA402" for instance <rom[0].rom_inst> in unit <submod.1>.
Set user-defined property "INIT = 000000000000000000007C88E260C5308343C6E3F494DB0F8BF0B6DFA25DA402" for instance <rom[1].rom_inst> in unit <submod.1>.
Analyzing module <submod.2> in library <work>.
Module <submod.2> is correct for synthesis.
Set user-defined property "INIT = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" for instance <rom[0].rom_inst> in unit <submod.2>.
Set user-defined property "INIT = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" for instance <rom[1].rom_inst> in unit <submod.2>.
说明两个submid中的四个rom都有自己的值,是我想要的结果
2.注释掉test_rom中的include语句,而保留midmod中的include,综合的结果中有下面输出(test_rom.syr中找),结果如下:
Analyzing top module <test_rom>.
Module <test_rom> is correct for synthesis.
Analyzing module <midmod> in library <work>.
Module <midmod> is correct for synthesis.
Analyzing module <submod> in library <work>.
Module <submod> is correct for synthesis.
Set user-defined property "INIT = 000000000000000000007C88E260C5308343C6E3F494DB0F8BF0B6DFA25DA402" for instance <rom[0].rom_inst> in unit <submod>.
Set user-defined property "INIT = 000000000000000000007C88E260C5308343C6E3F494DB0F8BF0B6DFA25DA402" for instance <rom[1].rom_inst> in unit <submod>.
它的综合结果并没有两个midmod,这我表示非常纳闷。
根据这个现象,我猜想,Xilinx ISE的综合器XST可能不认识generate语句中的for语句的标签,但是它认识当前模块的子
模块的generate和for语句的标签...猜想而已...呼唤@police @teamo @lanphon给个靠谱解释...
附件中是我写的测试的例子,用ISE12.1测的
--------------------------------------------------------
另外还做了两个试验,在上面试验2的基础上,有两种方法可以让它达到试验1的效果:
1.给submod加一个没有用的参数FLAG,generate语句写成
generate
for(i=0;i<2;i=i+1)
begin:sub
submod #(FLAG(i))submod_inst(XXX)
end
endgenerate
这样每个submod就有一个值不同的参数了。
2.在例化submod的地方加上(*KEEP="TRUE"*)或者//synthesis attribute KEEP of submod_inst ="TRUE",避免综合优化掉我的submod。
这两种办法也有效,我猜想可能是XST认为我的generate语句生成的submod是一样的,然后就优化掉了,而忽略了我的两个submod的ROM里面的初始值不一样这个问题
这是一条镜像帖。来源:北邮人论坛 / circuit / #19494同步于 2012/2/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
在verilog中给ROM初始化参数,大家有没有遇到过这样的问题?
leonzyz
2012/2/15镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
用lpm_ROM ,如果你是用altera的话,不过要自己先准备好数据文件,文件格式是hex或者mif格式,我一般都是在matlab下面生成好mif直接导入ROM中就可以了
平常用defparam给下层模块的参数赋值也没什么问题啊,我没有用向导来生成rom,直接用xilinx ROM256X1的原语例化的,我觉得问题出在,在高层模块中,给低层模块的两个不同实例的参数赋值这个环节上,但是不知道为什么,以及如何做,而且功能仿真没有问题,难道是defparam只支持仿真?不能啊...
【 在 yuxuejun1123 的大作中提到: 】
: 用lpm_ROM ,如果你是用altera的话,不过要自己先准备好数据文件,文件格式是hex或者mif格式,我一般都是在matlab下面生成好mif直接导入ROM中就可以了
你说对了
defparam这么逆天的东西当然不能综合了
这不就相当于有两个东西同时对wire或者是reg赋值了么。
【 在 leonzyz (leonzyz) 的大作中提到: 】
: 平常用defparam给下层模块的参数赋值也没什么问题啊,我没有用向导来生成rom,直接用xilinx ROM256X1的原语例化的,我觉得问题出在,在高层模块中,给低层模块的两个不同实例的参数赋值这个环节上,但是不知道为什么,以及如何做,而且功能仿真没有问题,难道是defparam
我觉得它也有点变态,那么肿么才能综合呢。。。
【 在 police 的大作中提到: 】
: 你说对了
: defparam这么逆天的东西当然不能综合了
: 这不就相当于有两个东西同时对wire或者是reg赋值了么。
: ...................
为虾米不自己产生mif文件呢?
在matlab产生好之后,按照8列排序一下,然后复制粘贴就好了
Quartus的mif产生界面做的挺好的,这样生成绝对不会出错。
【 在 leonzyz 的大作中提到: 】
: 简单写一下代码:
: ///////////////////////////////////////////
: //顶层模块
: ...................
问题是我需要在高层来配置低层的ROM的参数阿,例如我要写滤波器,滤波器的结构都是一样的
但是他们的系数不一样,而且有若干个,我只能从例化所有滤波器的那个文件中去为每个滤波器的系数ROM去设置初始值,我想不出更好的办法了。。。
我是参照这别人一个包含zpu的工程中初始化它的bootram的方法来弄的,也不是凭空想出来的方法...
【 在 teamo 的大作中提到: 】
: 为虾米不自己产生mif文件呢?
: 在matlab产生好之后,按照8列排序一下,然后复制粘贴就好了
: Quartus的mif产生界面做的挺好的,这样生成绝对不会出错。
: ...................
给那个模块再传个参数进去呗
FPGA的体系结构不太一样。。。唔
【 在 leonzyz (leonzyz) 的大作中提到: 】
: 问题是我需要在高层来配置低层的ROM的参数阿,例如我要写滤波器,滤波器的结构都是一样的
: 但是他们的系数不一样,而且有若干个,我只能从例化所有滤波器的那个文件中去为每个滤波器的系数ROM去设置初始值,我想不出更好的办法了。。。
: 我是参照这别人一个包含zpu的工程中初始化它的bootram的方法来弄的,也不是凭空想出来的方法...
: ...................