我是verilog的业余爱好者。我试图调用模块分频器。但我在综合中得到的错误如“参考矢量reg'qtnt'不是合法的净值左右”。我曾尝试使用电线作为输入,但当我尝试为它们分配值时,收到了错误消息。请帮忙
module euclid_mul(
input[9:0] p0,p1,q0,
input[19:0] tot,
input clk,
output reg [20:0] p2,
output reg out_en,o1,o2
);
reg[20:0] dvr,dvd,qtnt,rem;
reg[9:0] ph;
reg[20:0] mul,res;
reg enable,f1;
initial f1=0;
initial enable=0;
divider div2(dvd,dvr,enable,qtnt,rem,f1);
always @ (negedge clk)
begin
if(f1==0) begin
mul=q0*p1;
ph=p0;
res={11'b00000000000,ph[9:0]}-mul;
if(res[20])
begin
o1=1;
dvd=-res;
end
else
dvd=res;
o2=1;
dvr=tot;
enable=1;
end
end
always @(posedge f1)
begin
if(res[20])
begin
p2=tot-rem;
out_en=1;
end
else
begin
p2=rem;
out_en=1;
end
end
endmodule
答案 0 :(得分:1)
如果您格式化代码以便更容易阅读,则可能会获得更多响应。如下所示:
我还指出了一个部分,我认为你错过了一个开头和结尾的陈述。
同样在时钟部分内,您经常需要使用非阻塞分配<=
。
由于你没有提供分频器模块,我宁愿看到命名而不是按顺序指定的端口,它可能有助于我们知道它可能做什么,甚至更好地用它的方向和宽度标记它。
module euclid_mul(
input [9:0] p0,p1,q0,
input [19:0] tot,
input clk,
output reg [20:0] p2,
output reg out_en,o1,o2
);
reg [20:0] dvr,dvd,qtnt,rem;
reg [9:0] ph;
reg [20:0] mul,res;
reg enable,f1;
initial begin
f1 = 0;
enable = 0;
end
divider div2(dvd,dvr,enable,qtnt,rem,f1);
// My prefered style to help us understand conectivity.
//divider
// divider_i0(
// .divisor( dvd ), //input [20:0]
// .result ( res ) //output [20:0]
//);
always @ (negedge clk) begin
if(f1==0) begin
mul = q0*p1;
ph = p0;
res = {11'b00000000000,ph[9:0]}-mul;
if ( res[20] ) begin
o1 = 1;
dvd = -res;
end
else begin //There was a missing begin
dvd = res;
o2 = 1;
dvr = tot;
enable = 1;
end //Missing End
end
end
always @(posedge f1) begin
if(res[20]) begin
p2 = tot-rem;
out_en = 1;
end
else begin
p2 = rem;
out_en = 1;
end
end
endmodule
输入可以是reg
,并且可以从始终或初始块内部驱动,也可以从单个assign
或其他模块输出驱动的线路驱动。
输出应始终连接到电线,模块驱动它们。