sock

搞定Verilog中的generate ,参数传递,for的用法

0
阅读(18223)

新工作第一天,看了看别人的代码,发现自己对于Verilog语言还是有很多不清晰的地方,谨以此篇博客。希望自己能够搞清楚一些不清晰地东西。即使将来忘了回过头来再看看也能够马上回忆起来。废话结束。上正文。

        Verilog-1995 支持通过以声明实例数组的形式对primitive和module进行复制结构建模。而在Verilog-2001里,新增加的generate语句拓展了这种用法(其思想来源于VHDL语言)。除了允许复制产生primitive和module的多个实例化,同时也可以复制产生多个net、reg、parameter、assign、always、initial、task、function。 
在generate中引入了一种新的变量类型:genvar,用以在generate-for语句中声明一个正整数的索引变量(如果将“X”或“Z”或者“负值”赋给genvar 变量,将会出错)。genvar 变量可以声明在generate语句内,也可以声明在generate语句外。            (摘自百度文库,对于对于这些语言的标准我觉得没必要去细究,知道用法就行了)

        generate语句有generate-for、genreate-if和generate-case三种语句。由于我遇到的常用的就是generate-for语句,这里我就记下generate-for语句的用法。

exp1: 

module gray2bin2 (bin, gray); 
    parameter SIZE = 8; // this module is parameterizable output [SIZE-1:0] bin; 
    input [SIZE-1:0] gray; 

    reg [SIZE-1:0] bin;  

    genvar i; 

    generate  

        for(i=0; i<SIZE; i=i+1) 
            begin: bit 
                    always @(gray[SIZE-1:i]) // fixed part select 
                            bin[i] = ^gray[SIZE-1:i]; 
            end 

    endgenerate 

endmodule 等同于下面的语句: 
always @(gray[SIZE-1:0]) // fixed part select 
        bin[0] = ^gray[SIZE-1:0]; 

always @(gray[SIZE-1:1]) // fixed part select 
        bin[1] = ^gray[SIZE-1:1]; 

always @(gray[SIZE-1:2]) // fixed part select 

        bin[2] = ^gray[SIZE-1:2]; 
always @(gray[SIZE-1:3]) // fixed part select 

        bin[3] = ^gray[SIZE-1:3]; 
always @(gray[SIZE-1:4]) // fixed part select 

        bin[4] = ^gray[SIZE-1:4]; 
always @(gray[SIZE-1:5]) // fixed part select 
        bin[5] = ^gray[SIZE-1:5]; 
always @(gray[SIZE-1:6]) // fixed part select 
        bin[6] = ^gray[SIZE-1:6]; 
always @(gray[SIZE-1:7]) // fixed part select 
        bin[7] = ^gray[SIZE-1:7];

        此例程中用到的是always语句,generate-for语句起到的作用很明显,就是代码的复制,也可以说是逻辑的复制。

exp2:多层generate语句所复制产生的实例命名方式; 

parameter SIZE = 2; genvar i, j, k, m; 
generate 
        for(i=0; i<SIZE; i=i+1) 

        begin: B1   // scope B1[i] 
                M1 N1();  // instantiates B1[i].N1 

                for(j=0; j<SIZE; j=j+1) 
                begin: B2   // scope B1[i].B2[j] 
                        M2 N2();  // instantiates B1[i].B2[j].N2 
                        for(k=0; k<SIZE; k=k+1) 

                                begin: B3   // scope B1[i].B2[j].B3[k] 
                                        M3 N3();  // instantiates B1[i].B2[j].B3[k].N3 

                                 end 

                 end 
                  if(i>0) 
                         for(m=0; m<SIZE; m=m+1) 
                         begin: B4   // scope B1[i].B4[m] 
                                 M4 N4();  // instantiates B1[i].B4[m].N4 

                          end 
           end 
endgenerate 
下面是复制产生的实例名称的几个例子: B1[0].N1  B1[1].N1 
B1[0].B2[0].N2  B1[0].B2[1].N2 
B1[0].B2[0].B3[0].N3  B1[0].B2[0].B3[1].N3 B1[0].B2[1].B3[0].N3 
B1[1].B4[0].N4  B1[1].B4[1].N4

在这里大家需要注意的就是实例产生后的名称。第一级循环在最前,然后依次往后排列就行了。

明天了将参数传递的用法看一下后补上。