2017-02-28 2 views
0

Wie kann ich die Taktung Block in Verilog verwenden, um einen entsprechenden Code an die nicht-blockierende Zuordnungwie Block Clocking verwenden, in Verilog

if((datain1[49]==1)||(datain2[49]==1)||(datain3[49]==1)||(datain4[49]==1)) 
begin 
buffer[1][59:50] <=buffer[1][147:138]; 
buffer[1][147:138]<=buffer[1][235:226]; 

buffer[2][59:50] <=buffer[2][147:138]; 
buffer[2][147:138]<=buffer[2][235:226]; 

buffer[3][59:50] <=buffer[3][147:138]; 
buffer[3][147:138]<=buffer[3][235:226]; 

buffer[4][59:50] <=buffer[4][147:138]; 
buffer[4][147:138]<=buffer[4][235:226]; 
end 

Antwort

1

Sie können keine Taktblock nutzen, um ein Äquivalent zu einem nicht zu erhalten -Blockierung.

System Verilog hat 9 Terminierungsregionen:

from prev time step 
     | 
    PREPONED 
     | 
     ACTIVE 
     | 
    INACTIVE 
     | 
     NBA 
     | 
    OBSERVED 
     | 
    RE-ACTIVE 
     | 
    RE-INACTIVE 
     | 
     RE-NBA 
     | 
    POSTPONED 
     | 
     V 
to next time step 

Signale von einem Taktblock angetrieben werden, in der RE-NBA Region angetrieben, während Variablen, die eine nicht-blockierende Zuordnung zur Verwendung in der NBA Region zugeordnet ist, .

+0

Wie kann ich eine NBA durch einen beliebigen Typ ersetzen, um das gleiche Ergebnis zu erhalten ... NBA verursacht ein Problem in meinem Code, da es eine Mischung aus Blockierung und NBA in demselben Modul gibt –

+0

Taktblöcke sind nur für Ihre Testbench. Sprechen Sie über Ihren Testbench-Code oder Ihr Design? –

+0

Ich spreche über das Design ..... Ich möchte mein Design synthetisieren –

2

Taktgeberblöcke werden Ihnen bei dem, was Sie erreichen möchten, nicht helfen.

Ihre original code hat buffer Zuweisung selbst (asynchrone Rückmeldung). Es spielt keine Rolle, dass buffer nicht Teil der Empfindlichkeitsliste ist, Synthesizer behandeln es so, als ob es Teil der Empfindlichkeitsliste ist. Du hast eine Takteingabe, du solltest sie benutzen.

Ich schlage vor, dass Sie Ihren Codierungsstil zu einem Zwei-Immer-Block-Ansatz ändern. Ein Always-Block sollte reine Konbinationslogik für Next-State-Berechnungen sein. Der zweite immer Block ist für synchrone Zuweisungen. Wenn Sie mehr über verschiedene Codierungsstile und deren Stärken und Schwächen erfahren möchten, empfehle ich Ihnen this paper von Cliff Cummings.

Sie Code sollte wie folgt sein:

// Use 'reg' for Verilog; 'logic' is recommended for SytemVerilog 
reg  [263:0] buffer [0:63]; // flopped value 
reg  [263:0] next_buffer [0:63]; // next-state of buffer 

// Use whatever name you want for the indexes so long as they are unique per always block 
integer comb_idx; ff_idx; 

// always_comb // <<== SystemVerilog 
always @* // <<== Verilog (IEEE1364-2001) 
begin 
    for(comb_idx = 0; comb_idx<64; comb_idx=comb_idx+1) begin 
    next_buffer[comb_idx] = buffer[comb_idx]; // initialize 
    end 

    if(start) begin 
    next_buffer[0] = 0; 
    // ... 
    end 

    // ... other conbinational and next-state calculations ... 

    if((datain1[49]==1)||(datain2[49]==1)||(datain3[49]==1)||(datain4[49]==1)) 
    begin 
    // we can use a loop for this 
    for(comb_idx = 1; comb_idx<27; comb_idx=comb_idx+1) begin 
     next_buffer[comb_idx][59:50] = buffer[comb_idx][147:138]; 
     next_buffer[comb_idx][147:138] = buffer[comb_idx][235:226]; 
    end 
    end 
end 

/* 
// SystemVerilog 
always_ff @(posedge clk) 
begin 
    // ... other synchronous assignments ... 

    // SystemVerilog can assign unpacked arrays of same dimensions on one shot 
    buffer <= next_buffer; type 
end 
*/ 

// Verilog 
always @(posedge clk) 
begin 
    // ... other synchronous assignments ... 
    for(ff_idx = 0; ff_idx<64; ff_idx=ff_idx+1) begin 
    // Verilog cannot assign unpacked arrays in one shot 
    buffer[ff_idx] <= next_buffer[ff_idx]; 
    end 
end 
0

Sprechen Sie über SystemVerilog oder Verilog? In Verilog gibt es KEINE Taktung.