2017-03-22 4 views
1

J'ai rencontré un banc d'essai qui peut essentiellement être réduit à l'exemple ci-dessous: l'horloge et les signaux sont modifiés dans le même pas de temps avec des affectations de blocage. Je crois que cela provoque une condition de course entre l'horloge et les deux signaux ctrlX, mais je n'ai pas pu prouver dans le terrain de jeu de l'EDA (je comprends que c'est hors de mon contrôle). Ai-je raison de dire qu'il y a une condition de concurrence? (EDA lien Playground: https://www.edaplayground.com/x/5yDX#&togetherjs=gkG5xewfNN)Condition de course entre les signaux

module tb_example; 


    reg clk = 1; 
    reg [3:0] dff1,dff2; 
    reg [3:0] ctrl1 = 'd0; 
    reg [3:0] ctrl2 = 'd0; 

    initial begin 
    #10 ctrl1 = 'd1; 
    #20 ctrl1 = 'd2; 
    #10 ctrl1 = 'd3; 
    #100 $finish; 
    end 

    always begin 
    #5 clk = !clk; 
    end 

    initial begin 
    $dumpfile("dump.vcd"); 
    $dumpvars(0,tb_example); 
    end 

    initial begin 
    #10 ctrl2 = 'd1; 
    #20 ctrl2 = 'd2; 
    #10 ctrl2 = 'd3; 
    #100 $finish; 
    end 

    always @ (posedge(clk)) begin 
    dff1 <= ctrl1; 
    end 

    always @ (posedge(clk)) begin 
    dff2 <= ctrl2; 
    end 

endmodule 

Répondre

1

Oui, ceci est une condition de course parce que vous utilisez les affectations de blocage pour CTRLX et ils changent en même temps que posedge clk. Ainsi, les valeurs assignées à dffx sont indéterminées et peuvent varier d'un simulateur à un autre.

Une façon d'éviter cela est de changer CTRLX sur le negedge de clk:

reg clk = 0;