Brainer: Laver Active-HDL fejl?

fre okt 08, 2010 (Axcon)

Braineren fra sidst, hvor vi havde et lumsk spørgsmål fra et C++ projekt, var måske ikke så svær igen… og dog… Jørgen Abrahamsen er helt klart på rette spor, men hæderen går til Peter Stuge for hans grundige svar.

Læs hele Mortens kommentar med det fulde svar…

Og så til den nye brainer, som starter med et voldsomt udbrud fra et af kontorerne: “Gid en vis person havde Active-HDL! Det må da være en fejl i værktøjet!” – men er det nu det?

Vi skal nok lige have starten med…

Det hele kommer fra en meget enkel stump VHDL, som ser sådan her ud i simplificerert form:

-- clk, reset are both std_logic
process (clk) is
begin
  if rising_edge(clk) then
    if reset = '1' then
      d <= '0';
    else
      d <= not d;
    end if;
  end if;
end process;

Hvad koden gør er ikke så vigtigt her, men koden ser ud til at virke helt som den skal i en testbench. Køres den derimod i en nyere og bedre testbench, så fejler den. I Active-HDL wave vieweren ser clk og reset signalerne ud til at være helt identiske for de to forskellige testbenche, men i den ny og forbedrede testbench virker det som om intet inde i processen bliver eksekveret.

Tager Active-HDL fejl? Eller kan der være noget galt i testbenchen?

Den første, som kommer med det rigtige svar i kommentarerne herunder vinder hele æren.

Kommentarer (7)

  1. Knud Andersen added on 10. oktober 2010

    d is not initialized to either ’0′ or ’1′ (what does not ‘z’ return?)

  2. Drazen added on 10. oktober 2010

    En af faldgruberne kunne være ved det synkrone reset, således er det tidligere set at simulatoren ikke generer events såfrem at reset er resynkroniseret med eksakt samme delta cycle af clocken. Det kunne tænkes at testbænken er ændret mht. til dette.

  3. Peter Sørensen added on 11. oktober 2010

    Der er ikke noget galt med denne kode.
    Det er et helt igennem standard måde at at lave en D-flipflop med enable. signal reset er enable. Sagt på anden måde er reset altså en synchron reset.
    Det er næsten kun fantasien som sætter grænser for hvad man kan lave af mærkelige ting i en testbench.
    Her tænker jeg specielt på hvordan man laver reset signalet, hvordan er det timet i forhold til clk?
    Jeg mener ikke der er nok oplysninger til man kan gætte sig til hvad hans problem har været.

  4. Peter Sørensen added on 11. oktober 2010

    Nå ja, der er naturligvis den helt enkle mulighed at testbench ikke starter med at sætte reset =’1′!
    Gør den ikke det er d= ‘U’ og det bliver den naturligvis ved med at være indtil den får en kendt startværdi. Hvorimod HW vil vælge en tilfældig startværdi og så toggle d for hver clock.

  5. Morten Kristiansen added on 11. oktober 2010

    Som ekstra spor kan jeg nævne at ikke engang reagerede på reset signalet. Kun den viste process driver signalet “d”

    –MK

  6. Kai Harrekilde-Petersen added on 11. oktober 2010

    @MK: selvfølgelig reagerer processen ikke på reset signalet – det står ikke nævnt i sensitivity listen.

    Er det iøvrigt meningen at reset er synkront?

    –Kai

  7. Morten Kristiansen added on 11. oktober 2010

    @Kai: Reset skal ikke stå i sensitivity listen da der er tale om synkron reset. Selve koden som du ser er der ikke noget galt med.

    Reset sættes til en. Selv om man observerer en togglende clock i wave-vieweren resetter ovenstående kode ikke. Når reset er lav kommer der ikke noget signal igennem selv om man observerer en clock i wave-vieweren… ?

Hvad mener du?