运行实施错误。我的编码有误吗?

时间:2018-10-02 11:15:47

标签: verilog vivado

在vivado 2018.2上运行实施时出现错误

这是错误的详细信息:

[Place 30-494]设计为空 解决方法:检查opt_design是否已删除设计中的所有叶子单元。检查是否已实例化并连接了所有顶级端口。 [通用17-69]命令失败:放置程序无法放置所有实例

我的代码如下:

`timescale 1ns/1ns

module fa_seq(a, b, cin, sum, cout);
    input a, b, cin;
    output reg sum, cout;
    reg t1, t2, t3;
    always
         @(a or b or cin) begin
             sum <= (a ^ b & cin);
             t1 = a & cin;
             t2 = b & cin;
             t3 = a & b;
             cout = (t1 | t2) | t3;
    end
endmodule

module fa_top;
    reg pa, pb, pci;
    wire pco, psum;

    fa_seq uf1(pa, pb, pci, psum, pco);
    initial
        begin: blk_only_once
            reg[3:0] pal;

            for(pal = 0; pal < 8; pal = pal + 1)
                begin
                    {pa,pb,pci} <= pal;
                    #5 $display("pa,pb,pci = %b%b%b",pa,pb,pci,":::pco,psum=%b%b",pco,psum);
                end
        end
endmodule

感谢您的回答。

2 个答案:

答案 0 :(得分:0)

  

检查是否已实例化并连接了所有顶级端口。

您似乎已经综合了您的实际设计了您的测试平台。 测试平台是顶层模块,没有端口,因此所有逻辑都被优化了。

您应该将设计分为具有RTL的文件和具有测试平台/模拟代码的文件。在Vivado中,如果您要“添加文件”,则必须指定其类型,这是屏幕截图: enter image description here

答案 1 :(得分:0)

您的代码具有一个推断出的闩锁。此外,您在同一Always Block中同时使用了阻塞和非阻塞分配。

always
     @(a or b or cin) begin //Not all dependencies are mentioned
         sum <= (a ^ b & cin); //Non-blocking assignment
         t1 = a & cin;
         t2 = b & cin;
         t3 = a & b;
         cout = (t1 | t2) | t3;
end

我建议您重新编写Always块,如下所示。

always
     @(*) begin
         sum  = (a ^ b & cin);
         t1   = a & cin;
         t2   = b & cin;
         t3   = a & b;
         cout = (t1 | t2) | t3;
end

实际上,您不需要上述组合逻辑的always块。只需使用Assign语句即可。

module fa_seq(a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
wire t1, t2, t3;

   assign sum = (a ^ b & cin);
   assign  t1 = a & cin;
   assign  t2 = b & cin;
   assign  t3 = a & b;
   assign  cout = (t1 | t2) | t3;

endmodule

但是,编写完整加法器代码的有效方法是:-

module fa_seq(a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;

   assign {cout,sum} = (a + b + cin);

 endmodule