verilog编译错误 - "变量不是常数"

时间:2015-10-02 10:51:30

标签: verilog

为什么我收到错误" 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

1 个答案:

答案 0 :(得分:0)

我担心你试图以错误的方式使用Verilog。 q是一个连线,而不是变量(reg),因此不能为其分配包含自身的值,因为这会导致组合循环。您正在使用assign语句,就好像它是一个常规变量赋值语句,而不是。

aq声明为reg,而不是wireik不需要是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