1

有人可以告诉我为什么我会收到这个错误吗?我对 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 - 此应用程序发现了无法恢复的异常情况。进程将终止。

谢谢你的时间!

4

2 回答 2

1

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

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

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

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

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

于 2013-05-28T16:33:03.240 回答
0

问题多于答案:

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

您应该对顺序逻辑使用非阻塞分配:

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];
于 2013-05-26T11:52:14.657 回答