BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / circuit / #19494同步于 2012/2/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖

在verilog中给ROM初始化参数,大家有没有遇到过这样的问题?

leonzyz
2012/2/15镜像同步7 回复
简单写一下代码: /////////////////////////////////////////// //顶层模块 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里面的初始值不一样这个问题
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
yuxuejun1123机器人#1 · 2012/2/15
用lpm_ROM ,如果你是用altera的话,不过要自己先准备好数据文件,文件格式是hex或者mif格式,我一般都是在matlab下面生成好mif直接导入ROM中就可以了
leonzyz机器人#2 · 2012/2/15
平常用defparam给下层模块的参数赋值也没什么问题啊,我没有用向导来生成rom,直接用xilinx ROM256X1的原语例化的,我觉得问题出在,在高层模块中,给低层模块的两个不同实例的参数赋值这个环节上,但是不知道为什么,以及如何做,而且功能仿真没有问题,难道是defparam只支持仿真?不能啊... 【 在 yuxuejun1123 的大作中提到: 】 : 用lpm_ROM ,如果你是用altera的话,不过要自己先准备好数据文件,文件格式是hex或者mif格式,我一般都是在matlab下面生成好mif直接导入ROM中就可以了
police机器人#3 · 2012/2/16
你说对了 defparam这么逆天的东西当然不能综合了 这不就相当于有两个东西同时对wire或者是reg赋值了么。 【 在 leonzyz (leonzyz) 的大作中提到: 】 : 平常用defparam给下层模块的参数赋值也没什么问题啊,我没有用向导来生成rom,直接用xilinx ROM256X1的原语例化的,我觉得问题出在,在高层模块中,给低层模块的两个不同实例的参数赋值这个环节上,但是不知道为什么,以及如何做,而且功能仿真没有问题,难道是defparam
leonzyz机器人#4 · 2012/2/16
我觉得它也有点变态,那么肿么才能综合呢。。。 【 在 police 的大作中提到: 】 : 你说对了 : defparam这么逆天的东西当然不能综合了 : 这不就相当于有两个东西同时对wire或者是reg赋值了么。 : ...................
teamo机器人#5 · 2012/2/16
为虾米不自己产生mif文件呢? 在matlab产生好之后,按照8列排序一下,然后复制粘贴就好了 Quartus的mif产生界面做的挺好的,这样生成绝对不会出错。 【 在 leonzyz 的大作中提到: 】 : 简单写一下代码: : /////////////////////////////////////////// : //顶层模块 : ...................
leonzyz机器人#6 · 2012/2/16
问题是我需要在高层来配置低层的ROM的参数阿,例如我要写滤波器,滤波器的结构都是一样的 但是他们的系数不一样,而且有若干个,我只能从例化所有滤波器的那个文件中去为每个滤波器的系数ROM去设置初始值,我想不出更好的办法了。。。 我是参照这别人一个包含zpu的工程中初始化它的bootram的方法来弄的,也不是凭空想出来的方法... 【 在 teamo 的大作中提到: 】 : 为虾米不自己产生mif文件呢? : 在matlab产生好之后,按照8列排序一下,然后复制粘贴就好了 : Quartus的mif产生界面做的挺好的,这样生成绝对不会出错。 : ...................
police机器人#7 · 2012/2/17
给那个模块再传个参数进去呗 FPGA的体系结构不太一样。。。唔 【 在 leonzyz (leonzyz) 的大作中提到: 】 : 问题是我需要在高层来配置低层的ROM的参数阿,例如我要写滤波器,滤波器的结构都是一样的 : 但是他们的系数不一样,而且有若干个,我只能从例化所有滤波器的那个文件中去为每个滤波器的系数ROM去设置初始值,我想不出更好的办法了。。。 : 我是参照这别人一个包含zpu的工程中初始化它的bootram的方法来弄的,也不是凭空想出来的方法... : ...................