使用verilog

时间:2018-02-03 06:14:09

标签: verilog

我正在为64位kogge stone加法器编写verilog代码。请帮助我如何编写计算的预处理阶段使用verilog中的循环生成和传播64位输入的信号?

module preprocessing64bit(a,b,g,p);
input  [63:0] a,b;
output [63:0] g,p;
reg [63:0] g,p;
integer i;

always @ (a or b)
begin
for(i=0;i<64;i=i+1)
begin 
assign p[i]=a[i]^b[i];
assign g[i]=a[i]&b[i];
end
end

endmodule

我写的这段代码但是没有用。我通过互联网进行了很多研究,但却无法找到正确的方法。 在Modelsim

中的编译中显示错误消息

错误:C:/ Users / Ankit / Documents / verilog project / preprocessing64bit.v(11):在程序连续分配中不允许使用reg的位选择:p。

**错误:C:/ Users / Ankit / Documents / verilog project / preprocessing64bit.v(12):程序连续分配中不允许使用reg的位选择:g

2 个答案:

答案 0 :(得分:2)

如果您没有使用Verilog的经验,可以理解错误消息让您感到困惑。是的,你犯了一个错误,但它与位选择无关。

你在'always @(...)中使用了'assign' 'assign'用于电线和外侧'always'部分 正确的语法是:

   p[i]=a[i]^b[i];
   g[i]=a[i]&b[i];

这将解决您的语法错误,然后代码是正确的 但是让我们再看看你的代码......

您正在使用for循环来处理位。但Verilog逻辑运算符将用于向量。这非常简单快捷:

always @ (a or b)
begin
    p = a ^ b;
    g = a & b ;
end

接下来的改进是,您现在也可以删除“始终”部分并使用分配。但要注意“分配”工作的是“电线”,而不是“电子邮件”因此它变为:

module preprocessing64bit(a,b,g,p);
input  [63:0] a,b;
output [63:0] g,p;

   assign p = a ^ b;
   assign g = a & b;

endmodule

作为最后的改进,我不会使用旧的端口定义,而是使用新的Verilog 2001语法:

module preprocessing64bit (
 input  [63:0] a,b,
 output [63:0] g,p
 );

答案 1 :(得分:0)

我多次使用“ if else”生成n位Kogge Stone加法器,这是一个很好的Verilog代码

 module nbitksa#(parameter n=64)(
       input [n-1:0]a,b,
       input cin,
        output [n-1:0]g,      //sum 
        output [n:0]h,        //concartinated carry and sum
        output c              //carry
       );

  wire [n-1:0]m,w;             // n-1  half adder
  wire  [n-1:1]x,y;            // first stage  output
  wire  [n-1:2]u,v;            // second stage output
  wire   [n-1:4]j,k;           // third stage output
  wire   [n-1:8]p,q;           // fourth stage output
  wire   [n-1:16]z,l;          // fifth stage output
  wire   [n-1:32]s,t;          // sixth stage output
  wire   [n-1:0]su;            // sum output
 genvar i;
 generate
      for(i=0;i<=n-1;i=i+1)
         begin
              p p0(a[i],b[i],m[i],w[i]);                  //instantiate half adder module                         
             if(i==0)                       
                   assign su[i]=cin^m[i];   
             else                   
                   begin

                          // first stage  output

                        q q0(m[i-1],m[i],w[i],w[i-1],x[i],y[i]);        //instantiate carry propagation and generation module            
                           if(i==1)
                             begin
                               assign su[i]=m[i]^w[i-1];         
                             end  
                          // second stage output                            
                         if(i>1)                                      
                              begin
                                  if(i==2)
                                         begin
                                        q q1(m[i-2],x[i],y[i],n[i-2],u[i],v[i]);     //instantiate carry propagation and generation module  
                                          assign su[i]=m[i]^y[i-1];
                                         end
                                  else
                                         begin
                                           q q2(x[i-2],x[i],y[i],y[i-2],u[i],v[i]);   //instantiate carry propagation and generation module  
                                             if(i==3)
                                                assign su[i]=m[i]^v[i-1];
                                          end
                                  // third stage output
                                  if(i>3)
                                      begin
                                                 if(i==4)
                                                    begin
                                                      q q3(m[i-4],u[i],v[i],n[i-4],j[i],k[i]);     //instantiate carry propagation and generation module  
                                                      assign su[i]=m[i]^v[i-1];
                                                    end
                                                  else if(i==5)
                                                     begin
                                                       q q4(x[i-4],u[i],v[i],y[i-4],j[i],k[i]);     //instantiate carry propagation and generation module  
                                                       assign su[i]=m[i]^k[i-1];
                                                     end
                                                  else
                                                     begin
                                                       q q5(u[i-4],u[i],v[i],v[i-4],j[i],k[i]);      //instantiate carry propagation and generation module  
                                                       assign su[i]=m[i]^k[i-1];
                                                     end
                                      // fourth stage output

                                         if(i>7)
                                             begin                                                        
                                                if(i==8)
                                                   begin     
                                                      q q6(m[i-8],j[i],k[i],n[i-8],p[i],q[i]);       //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^k[i-1];
                                                   end
                                                else if(i==9)
                                                   begin     
                                                      q q7(x[i-8],j[i],k[i],y[i-8],p[i],q[i]);       //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^q[i-1];
                                                   end
                                                else if((i==10) || (i==11))
                                                   begin     
                                                      q q8(u[i-8],j[i],k[i],v[i-8],p[i],q[i]);        //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^q[i-1];
                                                   end
                                                else
                                                   begin     
                                                      q q9(j[i-8],j[i],k[i],k[i-8],p[i],q[i]);        //instantiate carry propagation and generation module  
                                                      assign su[i]=m[i]^q[i-1];
                                                   end
                                            // fifth stage output
                                               if(i>15)
                                             begin                                                        
                                                if(i==16)
                                                   begin     
                                                      q q10(m[i-16],p[i],q[i],n[i-16],z[i],l[i]);      //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^q[i-1];
                                                   end
                                                else if(i==17)
                                                   begin     
                                                      q q11(x[i-16],p[i],q[i],y[i-16],z[i],l[i]);      //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^l[i-1];
                                                   end
                                                else if((i==18) || (i==19))
                                                   begin     
                                                      q q12(u[i-16],p[i],q[i],v[i-16],z[i],l[i]);       //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^l[i-1];
                                                   end
                                                else if((i>=20) && (i<=23))
                                                   begin     
                                                      q q13(j[i-16],p[i],q[i],k[i-16],z[i],l[i]);       //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^l[i-1];
                                                   end
                                                else
                                                   begin     
                                                      q q14(p[i-16],p[i],q[i],q[i-16],z[i],l[i]);       //instantiate carry propagation and generation module  
                                                      assign su[i]=m[i]^l[i-1];
                                                   end
                                          // sixth stage output
                                           if(i>31)
                                             begin                                                        
                                                if(i==32)
                                                   begin     
                                                      q q10(m[i-32],z[i],l[i],n[i-32],s[i],t[i]);      //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^l[i-1];
                                                   end
                                                else if(i==33)
                                                   begin     
                                                      q q11(x[i-32],z[i],l[i],y[i-32],s[i],t[i]);       //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^t[i-1];
                                                   end
                                                else if((i==34) || (i==35))
                                                   begin     
                                                      q q12(u[i-32],z[i],l[i],v[i-32],s[i],t[i]);       //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^t[i-1];
                                                   end
                                                else if((i>=36) && (i<=39))
                                                   begin     
                                                      q q13(j[i-32],z[i],l[i],k[i-32],s[i],t[i]);       //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^t[i-1];
                                                   end
                                                 else if((i>=40) && (i<=47))
                                                   begin     
                                                      q q13(p[i-32],z[i],l[i],p[i-32],s[i],t[i]);       //instantiate carry propagation and generation module  
                                                      assign  su[i]=m[i]^t[i-1];
                                                   end
                                                else
                                                   begin     
                                                      q q14(z[i-32],z[i],l[i],l[i-32],s[i],t[i]);        //instantiate carry propagation and generation module  
                                                      assign su[i]=m[i]^t[i-1];
                                                   end
                                             end
                                            end
                                         end
                                     end 
                                end                        
                    end                 
           end
  endgenerate 
assign g=su;
assign h={c,g};              // concartinated sum
assign c=(n>32)?t[n-1]:((n>16)?l[n-1]:((n>8)?q[n-1]:((n>4)?k[n-1]:v[n-1])));  //selecting the particular carry bit of n-stages
endmodule

module p(             //half adder module
      input a,b,
      output s,c
      );
  assign s=a^b;
  assign c=a&b;
endmodule
module q(             //carry propagation and generation module
      input a,b,g,f,
      output s,c
      );
  assign s=a&b;
  assign c=g|(b&f);
  endmodule