Verificación de números aleatorios en el experimento systemverilog

1. Breve descripción

La verificación de aleatorización es muy importante en la verificación de CI digital y la frecuencia de uso es relativamente alta. Para usar números aleatorios de manera más intuitiva, combino pequeños proyectos para aprender;

2. Código que se está probando

Tomo el código del decodificador 38 como ejemplo para hacer la verificación de aleatorización. Aquí está el código fuente:

module decoder_38(
        //clk & rst
        input               clk     ,
        input               rst     ,
        //decoder inout
        input               en      ,
        input       [2:0]   A       ,
        //decoder output        
        output  reg [7:0]   Y
);

always @(posedge clk or negedge rst) begin
    if(!rst)
        Y <= 8'b1111_1111;
    else if(en == 1'b1)
        case(A)
            3'b000 : Y <= 8'b1111_1110; 
            3'b001 : Y <= 8'b1111_1101;
            3'b010 : Y <= 8'b1111_1011;
            3'b011 : Y <= 8'b1111_0111;
            3'b100 : Y <= 8'b1110_1111;
            3'b101 : Y <= 8'b1101_1111;
            3'b110 : Y <= 8'b1011_1111;
            3'b111 : Y <= 8'b0111_1111;
            default : Y <= 8'b111_1111;
        endcase
    else
        Y <= 8'b1111_1111;
end

endmodule

3.banco de mesa

module tb;
    
logic           clk = 0     ;
logic           rst = 0     ;
logic           en  = 0     ;
logic   [2:0]   A   = 3'd0  ;
logic   [7:0]   Y           ;

always #10 clk = ~clk    ;

//声明一个生成随机数的类
class packet;               
    rand bit [2:0] number;                  //声明随机数
    constraint c {number>=0; number<=7;}    //约束随机数的范围
endclass

packet numb;      //声明一个句柄,相当于把类实例化                           
initial begin
    #50; rst = 1;
    #50;
    numb = new(); //分配空间
    en = 1;
    for(int i = 0; i < 10; i++) begin
    assert(numb.randomize()); //使用断言  
    A = numb.number;  //将随机值付给A端口
    $display("******** random_A = %d***********/n",numb.number);
    #100;
    end
    en = 0;
    #100;
    $finish;
end


//************* 以前verilog写法,现在注释掉 ********************
/*initial begin    
    #50 rst = 1;
    #50
    en = 1;
    A = 3'd2;
    #20
    A = 3'd6;
    #30
    A = 3'd5;
    #30
    A = 3'd0;
    #20
    A = 3'd3;
    #50
    en = 0;
    #10
    A = 3'd2;
    #100
    $finish;
end
*/
//**********************************************
decoder_38  u_decoder(
    .clk    (clk    ),
    .rst    (rst    ),
    .en     (en     ),
    .A      (A      ),
    .Y      (Y      )
);

//----------------------------------
//产生名为tb.fsdb的文件
//----------------------------------
initial	begin
	    $fsdbDumpfile("tb.fsdb");	    
        $fsdbDumpvars;
end

endmodule

Simulación 4.vcs

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

5. Resumen

Aprende mientras practicas. En algunos lugares, es posible que no entiendas lo suficiente y cometas errores. ¡Puedes corregirme y espero intercambiar más! ! !

Bienvenido a seguir mi cuenta pública: Core Kingdom, hay más intercambio de tecnología FPGA e IC digital, ¡y también puede obtener proyectos FPGA de código abierto!

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_40377195/article/details/108372360
Recomendado
Clasificación