1. 程式人生 > >FPGA-12-Verilog的書寫規範格式

FPGA-12-Verilog的書寫規範格式

程式碼規範有利於在專案和工程中的維護,養成習慣對後期的工作學習會有很大的幫助!

下面就看下各個情況的規範書寫格式是什麼

1.時序邏輯的規範寫法:

    always  @(posedge clk or negedge rst_n)begin    
        if(rst_n==1'b0)begin
            tmp_init<=1'b0;
        end
        else begin
            tmp_init<=time_ram_init;
        end
    end

2.組合邏輯的規範寫法:

    always  @(*)begin
        if(delay<DELAY_TIME)begin
            math=sec_low;
        end
        else if(delay<DELAY_TIME*2)begin
            math=sec_high;
        end
        else if(delay<DELAY_TIME*3)begin
            math=min_low;
        end
        else begin
            math=min_high;
        end
    end

3.always的規範寫法:(一個always只窮舉一個變數的各種情況)

    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            tmp_a1<=0;
        end
        else if(vld_in)begin
            tmp_a1<=a;
        end
        else begin
            tmp_a1<=tmp_a1;
        end
    end
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            tmp_b1<=0;
        end
        else if(vld_in)begin
            tmp_b1<=b;
        end
        else begin
            tmp_b1<=tmp_b1;
        end
    end

4.阻塞賦值與非阻塞賦值

//時序邏輯用非阻塞
    always  @(posedge clk or negedge rst_n)begin    
        if(rst_n==1'b0)begin
            tmp_init<=1'b0;
        end
        else begin
            tmp_init<=time_ram_init;
        end
    end

//組合邏輯阻塞
    always  @(*)begin
        if(delay<DELAY_TIME)begin
            math=sec_low;
        end
        else if(delay<DELAY_TIME*2)begin
            math=sec_high;
        end
        else if(delay<DELAY_TIME*3)begin
            math=min_low;
        end
        else begin
            math=min_high;
        end
    end

5.對齊例項:begin 對齊 訊號對齊

/*對齊示例*/
//訊號對齊:
    input                   clk                      ;
    input                   rst_n                    ;
    input                   time_ram_init            ;
    input                   time_ram_wr              ;
    input  [ONEDATA_W -1:0] time_ram_data            ;
    input  [ADRESS_W  -1:0] time_rd_times            ;
    input                   time_en                  ;
    output                  time_ram_ovful           ;
    output                  time_vld_out             ;
    output [NUM_W-1     :0] time_num_out             ;
    
    reg                     time_ram_ovful           ;
    reg                     time_vld_out             ;
    reg    [NUM_W     -1:0] time_num_out             ;
    reg    [ADRESS_W  -1:0] wr_adr                   ;
    reg    [ADRESS_W  -1:0] rd_adr                   ;
    reg                     tmp_init1                ;
    reg                     tmp_init2                ;
    reg                     flag_init_wadr           ;
    reg                     tmp_wr1                  ;
    reg                     tmp_wr2                  ;
    reg                     wr_en                    ;
    reg    [CNT_W     -1:0] count                    ;
    reg    [CNTOF_W   -1:0] cnt_ovful                ;
    reg    [CNTVLD_W  -1:0] cnt_vld                  ;
    reg    [ONEDATA_W -1:0] data_ram [DATARAM_W-1:0] ;
    reg    [CNTVLD_W  -1:0] vld_cnt_tmp              ;

//begin end對齊:
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
           tmp_init1<=1'b0;
        end
        else begin
           tmp_init1<=time_ram_init;
        end
    end

6.訊號的書寫規範

/*引數、巨集定義字母必須用大寫*/
//引數的定義:
    parameter     ADRESS_W  =   11;
    parameter     ONEDATA_W =   32;
    parameter     NUM_W     =    8;
    parameter     CNTOF_W   =    4;
    parameter     CNTVLD_W  =    4;
    parameter     CNT_W     =   20;
    parameter     DATARAM_W = 2048;
//巨集定義
`define OC8051_ALU_NOP 4'b0000
`define OC8051_ALU_ADD 4'b0001
`define OC8051_ALU_SUB 4'b0010
`define OC8051_ALU_MUL 4'b0011
`define OC8051_ALU_DIV 4'b0100
`define OC8051_ALU_DA  4'b0101
`define OC8051_ALU_NOT 4'b0110

7.時鐘復位訊號使用示例

//時鐘只能用在敏感列表,一個模組只能用一個時鐘
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
           tmp_init1<=1'b0;
        end
        else begin
           tmp_init1<=time_ram_init;
        end
    end
//禁止訊號做時鐘,而要用改成時鐘使能的方式;
//正確的做法:
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
           counter<=1'b0;
        end
        else if(counter==7)begin
            counter<=0;
        end
        else begin
           counter<=counter+1;
        end
    end
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            en<=0;
        end
        else if(counter==7)begin
            en<=1;
        end
        else begin
           en<=0;
        end
    end
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
           tmp_init1<=1'b0;
        end
        else if(en==1)begin
           tmp_init1<=time_ram_init;
        end
        else begin
            tmp_init1<=tmp_init1;
        end
    end

8.reg和wire的使用

/*reg型別的使用*/
    reg                     tmp_init1                ;
    reg                     tmp_init2                ;

    /*時序邏輯*/
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
           tmp_init1<=1'b0;
        end
        else begin
           tmp_init1<=time_ram_init;
        end
    end

    /*組合邏輯*/
    always  @(*)begin
           tmp_init2 = tmp_init1;
    end

/*wire型別的使用*/
    wire sys_rst_n;
    wire clk_25m;

    system_ctrl	u_system_ctrl(
	.clk				(clk_50m),//input	
	
	.sys_rst_n			(sys_rst_n),//output
	.clk_c0				(clk_25m)   //output
);


9.輸入輸出的規範

/*不能用組合輸出*/
//正確的做法
module key(clk,rst_n,key,key_out);
    input               clk    ;
    input               rst_n  ;
    input               key    ;
    output              key_out;
    reg                 key_out;


    ******
    ******


    always @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            key_out<=1'b0;
        end
        else if(count==COUNT_TIME-1)begin
            key_out<=1'b1;
        end
        else begin
            key_out<=1'b0;
        end
    end
endmodule
//錯誤的做法
module key(clk,rst_n,key,key_out);
    input               clk    ;
    input               rst_n  ;
    input               key    ;
    output              key_out;
    reg                 key_out;


    ******
    ******


    always  @(*)begin
       key_out=sw_5&(~sw_4);
    end 
endmodule