为什么我收到错误" q is not constant
"?
module prv(
input [7:0]x,
input [7:0]y,
output [49:0]z
);
wire [24:0]q;
assign z=1;
genvar k;
for (k=50; k<0; k=k-1)
begin
wire [25:0]a;
assign a=0;
assign q= x;
genvar i;
for(i=0; i<8; i=i+1)
begin
if(q[0]==1)
begin
assign a=a+z;
end
assign {a,q}={a,q}>>1;
end
assign z={a[24:0],q};
end
endmodule
答案 0 :(得分:0)
我担心你试图以错误的方式使用Verilog。 q
是一个连线,而不是变量(reg
),因此不能为其分配包含自身的值,因为这会导致组合循环。您正在使用assign
语句,就好像它是一个常规变量赋值语句,而不是。
将a
和q
声明为reg
,而不是wire
。 i
和k
不需要是genvars变量,除非您尝试通过复制一段代码(描述)来生成逻辑。对于需要表现为常规循环的for
循环(仅限模拟),请使用整数变量。
此外,行为代码必须包含在一个块中,让它成为组合,顺序或初始。
修改后的(但我无法保证其工作原理)版本的模块将是这样的:
module prv(
input wire [7:0] x,
input wire [7:0] y,
output reg [49:0] z
);
reg [24:0] q;
reg [25:0] a;
integer i,k;
initial begin
z = 1;
for (k=50; k<0; k=k-1) begin
a = 0;
q = x;
for (i=0; i<8; i=i+1) begin
if (q[0] == 1) begin
a = a + z;
end
{a,q} = {a,q}>>1;
end
z = {a[24:0],q};
end
endmodule