【问题标题】:Very confusing error with no cause mentioned非常混乱的错误,没有提及原因
【发布时间】:2013-05-26 07:02:44
【问题描述】:

有人可以告诉我为什么会出现此错误吗?我对 Verilog 还是很陌生,所以请原谅任何明显的缺陷。谢谢!

module func(clk,d,out);
input [3:0] d;
input clk;

reg [3:0] q[1:0];
output  [3:0] out;
always @(posedge clk)
begin
q[0][3:0]=d[3:0];
q[1][3:0]=d[3:0];

end
assign out=q[0]^q[1];

endmodule

:ERROR:Xst:917 - 未声明的信号 。 FATAL_ERROR:Xst:Portability/export/Port_Main.h:127:1.13 - 此应用程序发现了无法恢复的异常情况。进程将终止。

感谢您的宝贵时间!

【问题讨论】:

  • 您使用的是哪个版本的 ISE?我已经在 ISE 14.2 中尝试过您的代码,它运行良好。在我看来,好像您在 ISE 版本中发现了一个错误。 (顺便说一句:您应该在此始终块中使用非阻塞分配(

标签: verilog system-verilog synthesis


【解决方案1】:

尝试切换reg [3:0] q[1:0];output [3:0] out; 行的顺序。

您的代码在我的模拟器上编译,所以我猜这是您模拟器中的错误。但是一般建议总是在所有内部值之前声明input/output/inout

我建议您将端口语法更改为 IEEE Std 1364-2001 样式。例如:

module func(
    input        clk,
    input  [3:0] d,
    output [3:0] out );

正如其他人所建议的那样,您应该在 always 块内将阻塞分配 (=) 切换为非阻塞分配 (<=)。此修复将不是编译问题,但它将让您进入更好的编码风格,并让您免于将来遇到与 RTL 不匹配的简单综合问题。

【讨论】:

    【解决方案2】:

    问题多于答案:

    你用的是什么工具?工具是否支持合成寄存器数组?

    您应该对顺序逻辑使用非阻塞赋值:

    always @(posedge clk) begin
        q[0][3:0] <= d[3:0];
        q[1][3:0] <= d[3:0];
    end
    

    内存通常用冒号左边的 0 和右边的最后一个位置来声明:

    reg [3:0] q [0:1];
    

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 2018-11-30
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多