Vivado Error : static elaboration of top level verilog design unit(s) in library work failed
Vivado Error : static elaboration of top level verilog design unit(s) in library work failed
我使用门在 Verilog 中编写了以下代码:
`timescale 1ns / 1ps
module flip_flop (d,clk,q,q_bar);
input [36:0] d;
input clk;
output [36:0] q;
output [36:0] q_bar;
wire dbar,x,y;
not(dbar,d);
nand(x,clk,d);
nand(y,clk,dbar);
nand(q,q_bar,y);
nand(q_bar,q,x);
endmodule
module adder(A,B,S);
input [36:0] A;
input [36:0] B;
output [36:0] S;
assign S = A + B;
endmodule
module subtractor(A,B,S);
input [36:0] A;
input [36:0] B;
output [36:0] S;
assign S = A - B;
endmodule
module dec256sinc24b
(input mclk1, /* used to clk filter */
input reset, /* used to reset filter */
input mdata1, /* input data to be filtered */
output reg [15:0] DATA, /* filtered output*/
output reg data_en,
input [15:0] dec_rate
);
reg [36:0] MOUT;
reg [36:0] delta1;
reg [36:0] CNN1;
reg [36:0] CN1;
reg [36:0] CNN2;
reg [36:0] CN2;
reg [36:0] DN0;
reg [36:0] DN1;
reg [36:0] CN3;
reg [36:0] DN3;
reg [36:0] CN4;
reg [36:0] DN5;
reg [36:0] CN5;
reg [15:0] word_count;
reg word_clk;
reg enable;
/*Perform the Sinc action*/
always @ (mdata1)
if(mdata1==0)
MOUT <= 37'd0;
/* change 0 to a -1 for twos complement */
else
MOUT <= 37'd1;
/*decimation stage (MCLKOUT/WORD_CLK) */
always @ (negedge mclk1, posedge reset)
begin
if (reset)
word_count <= 16'd0;
else
begin
if ( word_count == dec_rate - 1 )
word_count <= 16'd0;
else
word_count <= word_count + 16'b1;
end
end
always @ ( negedge mclk1, posedge reset )
begin
if ( reset )
word_clk <= 1'b0;
else
begin
if ( word_count == dec_rate/2 - 1 )
word_clk <= 1'b1;
else if ( word_count == dec_rate - 1 )
word_clk <= 1'b0;
end
end
flip_flop M1(.d(MOUT),.clk(mclk1),.q(delta1));
adder M2(.A(CN1),.B(delta1),.S(CNN1));
flip_flop M3(.d(CNN1),.clk(mclk1),.q(CN1));
adder M4(.A(CN2),.B(CN1),.S(CNN2));
flip_flop M5(.d(CNN2),.clk(mclk1),.q(CN2));
flip_flop M6(.d(CN2),.clk(word_clk),.q(DN0));
flip_flop M7(.d(DN0),.clk(word_clk),.q(DN1));
subtractor M8(.A(DN0),.B(DN1),.S(CN3));
flip_flop M9(.d(CN3),.clk(word_clk),.q(DN3));
subtractor M10(.A(CN3),.B(DN3),.S(CN4));
flip_flop M11(.d(CN4),.clk(word_clk),.q(DN5));
subtractor M12(.A(CN4),.B(DN5),.S(CN5));
/* Clock the Sinc output into an output register
WORD_CLK = output word rate */
always @ (negedge word_clk )
begin
case ( dec_rate )
16'd32:begin
DATA <= (CN5[15:0] == 16'h8000) ? 16'hFFFF : {CN5[14:0], 1'b0};
end
16'd64:begin
DATA <= (CN5[18:2] == 17'h10000) ? 16'hFFFF : CN5[17:2];
end
16'd128:begin
DATA <= (CN5[21:5] == 17'h10000) ? 16'hFFFF : CN5[20:5];
end
16'd256:begin
DATA <= (CN5[24:8] == 17'h10000) ? 16'hFFFF : CN5[23:8];
end
16'd512:begin
DATA <= (CN5[27:11] == 17'h10000) ? 16'hFFFF : CN5[26:11];
end
16'd1024:begin
DATA <= (CN5[30:14] == 17'h10000) ? 16'hFFFF : CN5[29:14];
end
16'd2048:begin
DATA <= (CN5[33:17] == 17'h10000) ? 16'hFFFF : CN5[32:17];
end
16'd4096:begin
DATA <= (CN5[36:20] == 17'h10000) ? 16'hFFFF : CN5[35:20];
end
default:begin
DATA <= (CN5[24:8] == 17'h10000) ? 16'hFFFF : CN5[23:8];
end
endcase
end
/* Synchronize Data Output*/
always@ (negedge mclk1, posedge reset )
begin
if ( reset )
begin
data_en <= 1'b0;
enable <= 1'b1;
end
else
begin
if ( (word_count == dec_rate/2 - 1) && enable )
begin
data_en <= 1'b1;
enable <= 1'b0;
end
else if ( (word_count == dec_rate - 1) && ~enable )
begin
data_en <= 1'b0;
enable <= 1'b1;
end
else
data_en <= 1'b0;
end
end
endmodule
但是,我在 运行 代码时遇到以下错误:
primitive output connection must be a scalar net at line 12 (nand(q,q_bar,y);)
static elaboration of top level verilog design unit(s) in library work failed
如果有人能告诉我我的代码中有什么问题,我将不胜感激。
您不能在 primitives
上使用 multi-bit 操作,此处 nand(q,q_bar,y);
可用于单个位。尝试使用 genvar。
此外,网络 y
是一位,因此请检查这是否正确,因为最终 y
将稳定为 y = ~(q[36] & q[36]);
genvar i;
generate
for(i=0i<37;i++)
nand(q[i],q_bar[i],y);
endgenerate
您的代码中存在几个问题。
该错误消息表示您无法将 37 位矢量网络 (q
) 连接到 nand
原始门实例的输出端口。
Verilog built-in 门原语在这方面不同于模块。模块支持 multi-bit 个端口,但当您实例化单个门时,原语仅支持 single-bit 个端口。
但是,基元确实支持实例数组,其中基元关键字后跟实例名称和范围说明符。您可以通过更改来修复语法错误:
nand(q,q_bar,y);
至:
nand n1 [36:0] (q,q_bar,y);
参考IEEE Std 1800-2017, section 28.3.6 Primitive instance connection list.
另一个可能的问题是以下行可能不会执行您想要的操作:
not(dbar,d);
d
是 37 位,而 dbar
是一位。
此外,x
和 y
是单个位。您应该检查所有连接。
最后,众所周知,在 Verilog 中使用这样的基元对触发器建模非常困难,因为触发器是反馈电路。为自己省去很多麻烦,并使用适当的建模风格:行为使用 @(posedge clk)
就像您在代码中的其他地方所做的那样。
我使用门在 Verilog 中编写了以下代码:
`timescale 1ns / 1ps
module flip_flop (d,clk,q,q_bar);
input [36:0] d;
input clk;
output [36:0] q;
output [36:0] q_bar;
wire dbar,x,y;
not(dbar,d);
nand(x,clk,d);
nand(y,clk,dbar);
nand(q,q_bar,y);
nand(q_bar,q,x);
endmodule
module adder(A,B,S);
input [36:0] A;
input [36:0] B;
output [36:0] S;
assign S = A + B;
endmodule
module subtractor(A,B,S);
input [36:0] A;
input [36:0] B;
output [36:0] S;
assign S = A - B;
endmodule
module dec256sinc24b
(input mclk1, /* used to clk filter */
input reset, /* used to reset filter */
input mdata1, /* input data to be filtered */
output reg [15:0] DATA, /* filtered output*/
output reg data_en,
input [15:0] dec_rate
);
reg [36:0] MOUT;
reg [36:0] delta1;
reg [36:0] CNN1;
reg [36:0] CN1;
reg [36:0] CNN2;
reg [36:0] CN2;
reg [36:0] DN0;
reg [36:0] DN1;
reg [36:0] CN3;
reg [36:0] DN3;
reg [36:0] CN4;
reg [36:0] DN5;
reg [36:0] CN5;
reg [15:0] word_count;
reg word_clk;
reg enable;
/*Perform the Sinc action*/
always @ (mdata1)
if(mdata1==0)
MOUT <= 37'd0;
/* change 0 to a -1 for twos complement */
else
MOUT <= 37'd1;
/*decimation stage (MCLKOUT/WORD_CLK) */
always @ (negedge mclk1, posedge reset)
begin
if (reset)
word_count <= 16'd0;
else
begin
if ( word_count == dec_rate - 1 )
word_count <= 16'd0;
else
word_count <= word_count + 16'b1;
end
end
always @ ( negedge mclk1, posedge reset )
begin
if ( reset )
word_clk <= 1'b0;
else
begin
if ( word_count == dec_rate/2 - 1 )
word_clk <= 1'b1;
else if ( word_count == dec_rate - 1 )
word_clk <= 1'b0;
end
end
flip_flop M1(.d(MOUT),.clk(mclk1),.q(delta1));
adder M2(.A(CN1),.B(delta1),.S(CNN1));
flip_flop M3(.d(CNN1),.clk(mclk1),.q(CN1));
adder M4(.A(CN2),.B(CN1),.S(CNN2));
flip_flop M5(.d(CNN2),.clk(mclk1),.q(CN2));
flip_flop M6(.d(CN2),.clk(word_clk),.q(DN0));
flip_flop M7(.d(DN0),.clk(word_clk),.q(DN1));
subtractor M8(.A(DN0),.B(DN1),.S(CN3));
flip_flop M9(.d(CN3),.clk(word_clk),.q(DN3));
subtractor M10(.A(CN3),.B(DN3),.S(CN4));
flip_flop M11(.d(CN4),.clk(word_clk),.q(DN5));
subtractor M12(.A(CN4),.B(DN5),.S(CN5));
/* Clock the Sinc output into an output register
WORD_CLK = output word rate */
always @ (negedge word_clk )
begin
case ( dec_rate )
16'd32:begin
DATA <= (CN5[15:0] == 16'h8000) ? 16'hFFFF : {CN5[14:0], 1'b0};
end
16'd64:begin
DATA <= (CN5[18:2] == 17'h10000) ? 16'hFFFF : CN5[17:2];
end
16'd128:begin
DATA <= (CN5[21:5] == 17'h10000) ? 16'hFFFF : CN5[20:5];
end
16'd256:begin
DATA <= (CN5[24:8] == 17'h10000) ? 16'hFFFF : CN5[23:8];
end
16'd512:begin
DATA <= (CN5[27:11] == 17'h10000) ? 16'hFFFF : CN5[26:11];
end
16'd1024:begin
DATA <= (CN5[30:14] == 17'h10000) ? 16'hFFFF : CN5[29:14];
end
16'd2048:begin
DATA <= (CN5[33:17] == 17'h10000) ? 16'hFFFF : CN5[32:17];
end
16'd4096:begin
DATA <= (CN5[36:20] == 17'h10000) ? 16'hFFFF : CN5[35:20];
end
default:begin
DATA <= (CN5[24:8] == 17'h10000) ? 16'hFFFF : CN5[23:8];
end
endcase
end
/* Synchronize Data Output*/
always@ (negedge mclk1, posedge reset )
begin
if ( reset )
begin
data_en <= 1'b0;
enable <= 1'b1;
end
else
begin
if ( (word_count == dec_rate/2 - 1) && enable )
begin
data_en <= 1'b1;
enable <= 1'b0;
end
else if ( (word_count == dec_rate - 1) && ~enable )
begin
data_en <= 1'b0;
enable <= 1'b1;
end
else
data_en <= 1'b0;
end
end
endmodule
但是,我在 运行 代码时遇到以下错误:
primitive output connection must be a scalar net at line 12 (nand(q,q_bar,y);)
static elaboration of top level verilog design unit(s) in library work failed
如果有人能告诉我我的代码中有什么问题,我将不胜感激。
您不能在 primitives
上使用 multi-bit 操作,此处 nand(q,q_bar,y);
可用于单个位。尝试使用 genvar。
此外,网络 y
是一位,因此请检查这是否正确,因为最终 y
将稳定为 y = ~(q[36] & q[36]);
genvar i;
generate
for(i=0i<37;i++)
nand(q[i],q_bar[i],y);
endgenerate
您的代码中存在几个问题。
该错误消息表示您无法将 37 位矢量网络 (q
) 连接到 nand
原始门实例的输出端口。
Verilog built-in 门原语在这方面不同于模块。模块支持 multi-bit 个端口,但当您实例化单个门时,原语仅支持 single-bit 个端口。
但是,基元确实支持实例数组,其中基元关键字后跟实例名称和范围说明符。您可以通过更改来修复语法错误:
nand(q,q_bar,y);
至:
nand n1 [36:0] (q,q_bar,y);
参考IEEE Std 1800-2017, section 28.3.6 Primitive instance connection list.
另一个可能的问题是以下行可能不会执行您想要的操作:
not(dbar,d);
d
是 37 位,而 dbar
是一位。
此外,x
和 y
是单个位。您应该检查所有连接。
最后,众所周知,在 Verilog 中使用这样的基元对触发器建模非常困难,因为触发器是反馈电路。为自己省去很多麻烦,并使用适当的建模风格:行为使用 @(posedge clk)
就像您在代码中的其他地方所做的那样。