Oliver 发表于 2007-11-30 12:51:20

QII V7.2编译总遇到 Error (10028):Can't resolve multiple constant drivers for

QII V7.2编译总遇到"Error (10028):Can't resolve multiple constant drivers for net "rWE" at SRAM.v(144)"是什么原因啊?

大侠请指教.

Oliver 发表于 2007-11-30 16:33:22

怎么一个回的人都没有啊,呵呵,

已经解决了,原来是不能在两个以上always内对同一变量赋值.

另我想问一下verilog内如何定义"全局变量"啊.就是可以在多个.v文件内读写访问的那种.

还有就是"全局数组"如何实现啊?

that1101 发表于 2007-12-4 22:52:02

VerilogHDL不是C语言,不要使用全局变量,全局数组,数组什么之类的,仿真除外了。否则有这种思路的话赶快修改程序构架!呵呵

Oliver 发表于 2007-12-4 23:11:00

【2楼】 that1101:
大侠,我想在一些接口处实现FIFO,那我不用数组用什么方法实现呢?

我现在改成0,1,2....这样的编号了,然后使用case来跳转看倒底是读些那个变量.

资源倒是下来不少,可感觉好勒索啊!

现在刚开始写verilog,都只用一个module呢.这样来说就没有全局的东西了吧

laoki8888 发表于 2007-12-5 11:02:12

[例25] 使用非阻塞赋值语句,由于两个always 块对同一变量q 赋值产生竞争冒险的程序:
module badcode1 (q, d1, d2, clk, rst_n);
output q;
input d1, d2, clk, rst_n;
reg q;
always @(posedge clk or negedge rst_n)
if (!rst_n) q <= 1'b0;
else q <= d1;
always @(posedge clk or negedge rst_n)
if (!rst_n) q <= 1'b0;
else q <= d2;
endmodule
当综合工具(如Synopsys)读到[例25]的代码时,将产生以下警告信息:
Warning: In design 'badcode1', there is 1 multiple-driver
net with unknown wired-logic type.
如果忽略这个警告,继续编译例26,将产生两个触发器输出到一个两输入与门。其综合级前仿真与综合
后仿真的结果不完全一致。


原则6:严禁在多个always 块中对同一个变量赋值。


刚看到的

Oliver 发表于 2007-12-5 13:12:00

上面这个列25肯定有问题的,两个always条件相同(即同时执行),结果一个要=d1,另一个要=d2.

我是想实现:
module test(q,clk);
    input clk;
    output q;
    reg q;
   
    always @(posedge clk)begin
       q=1;
    end
   
    always @(negedge clk)begin
       q=0;
endmodule

理论上时序不冲突的.因为一个上升沿一个是下降沿.编译不过.

要不我改成:
    always @(clk)begin
       if(clk == 0)
         q=0;
       else
         q=1;
    end
还是不行.

laoki8888 发表于 2007-12-6 13:35:25

module test2(clk,q);
    input clk;
    output q;
    reg q;
   
    always @( clk)
    begin
        if(clk==0)
        q = 0;
        else q = 1;
    end
   
   
endmodule


貌似我可以综合啊,说时序逻辑最好用<=赋值

Oliver 发表于 2007-12-6 13:51:24

综合是可以,可仿真时序根本没有赶程序运行,你仿真一下clk和q的关系看看啊,好象不行啊

laoki8888 发表于 2007-12-6 20:21:29

仿真出来了,没有问题
module test2(clk,q);
    input clk;
    output q;
    reg q;
   
    always @( clk)
        begin
                if(clk==0)
               q = 1;
                else q = 0;
    end
   
   
endmodule

看图
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_185938.jpg

Oliver 发表于 2007-12-6 20:52:16

哦,那我试试,如果这样可以的话到是可以考虑

that1101 发表于 2007-12-6 22:21:51

to 【3楼】 Oliver
想要实现FIFO最好不要自己写,QuartusII有工具自动生成FIFO,而且是针对Altera的FPGA做过优化的。无经验的工程师自己写的FIFO在速度与面积上无法与它相比的。
这个工具的路径是Tools>MegaWizard Plug-in Manager...
FIFO需要占用很多寄存器资源,一般CPLD不适合使用FIFO。对于有片内RAM的FPGA,可以设置生成FIFO时使用片内RAM,这样可以节约大量逻辑资源。

that1101 发表于 2007-12-6 22:35:28

to 【4楼】 laoki8888 阿虚
这个并不是所谓的竞争冒险的问题。
这里的思路存在问题。首先,你究竟是想把d1赋值给q1还是想把d2赋值给q1呢?其次,如果d1与d2相等还好,如果不相等,例如d1=1,d2=0,那么q是为1好还是为0好呢?总得有个选择才行。
再来考虑具体的电路实现,q对应DFF,那么d1与d2要赋值给q,要么经过与门,或门,多路选择器或其它的逻辑门,怎不能把d1与d2短接在一起赋值给q把?所以程序描述出来的信息不够,综合器不知道怎么办(注意,综合器不比人聪明,事实是比人笨得多),所以综合出来得东西当然出错。实际上,有些综合工具直接就报错了,因为这是不可综合设计。

Oliver 发表于 2007-12-6 22:38:43

谢谢10楼的指点,那个功能我知道,我就是想用自己写的代码试试看.厂家的"库"应该是非常优化的.

that1101 发表于 2007-12-6 22:41:14

to 【5楼】 Oliver
这个描述同样属于不可综合设计,综合工具会直接报错。
道理很简单,一个寄存器不可能对时钟的两个边沿敏感,物理结构上无法实现。
仿真时可以这样用。

ppa2001 发表于 2007-12-6 22:42:42

长见识了哈~

that1101 发表于 2007-12-6 22:47:33

to laoki8888 阿虚
你这个程序根本就不是时序逻辑设计
那个描述实际上等价于
wire    q;
assign q= clk;
究竟什么是时序逻辑设计还是找本书看看吧。呵呵

Oliver 发表于 2007-12-6 22:55:06

that110大侠:

硬件电路可以在clk上升沿缩存一个"1",

下降沿取反后也等同于上升沿(但相位相差180度),不可以锁存一个"0"吗?

that1101 发表于 2007-12-9 22:29:53

to 【16楼】 Oliver
简单地说吧,采用always @ posedge 或always @negedge 语句描述的时序电路在FPGA中实现的方式就是采用D触发器(DFF),D触发器在时钟跳变边沿锁存数据,触发器只能接受一个时钟。always @posedge 语句描述的是D触发器在上升沿到来时锁村数据,always @negedge 描述的是时钟边沿的下降沿锁存数据。由于D触发器只能在上升沿或下降沿锁存数据,一个D触发器不可能两个边沿都利用(具体原因去看D触发器的原理),因此你的描述也就无法实现了。

Oliver 发表于 2007-12-9 23:04:35

谢谢that1101 的讲解,今天我看见了关HDL的不可综合原因,

什么除法,开方,双边沿触发,变量循环....都是过于抽象或者不可综合描述行为.

laoki8888 发表于 2007-12-9 23:10:52

谢谢 that1101 讲解
帮我看看我那个状态机问题好吗?

xinjie1023 发表于 2010-6-6 19:49:57

学习,现在也遇到这问题

fakeCode 发表于 2012-6-25 13:55:53

学习了,不错哈。

he33504898 发表于 2013-4-18 20:40:31

that1101 讲得很不错
页: [1]
查看完整版本: QII V7.2编译总遇到 Error (10028):Can't resolve multiple constant drivers for