Der Modellierungsstrom bleibt für eine feste Simulationszeit in einem bestimmten Bereich

Ich bin ein Neuling in SystemVerilog. Ich möchte wissen, wie man ein 8-Bit-Signal X modelliert, um vier Pegel für bestimmte Zeitbereiche zu erreichen. Lassen Sie zum Beispiel die zulässigen Werte von X zwischen 40 und 80 liegen (40 < X ​​< 80).

  1. 40 - X - 50 für 70 % der Simulationszeit: Zustand 1
  2. 50 - X - 60 für 10 % der Simulationszeit: Zustand 2
  3. 60 - X - 70 für 10 % der Simulationszeit: Zustand 3
  4. 70 - X - 80 für 10 % der Simulationszeit: Zustand 4
Es ist wirklich unklar, was Sie hier tun wollen.
Immer noch nicht klar, worauf du hinauswillst. Möchten Sie für 7 Taktzyklen in Zustand 1 bleiben, dann für 1 Taktzyklus in Zustand 2 gehen, dann 3 für 1 Zyklus, dann 4 für 1 Zyklus und dann wiederholen? Oder möchten Sie einen Random Walk machen, der 70 % der Zeit in Zustand 1 und 10 % der Zeit in jedem der anderen 3 verbringt? Etwas ganz anderes?
@alex Ich brauche einen Random Walk. Ich habe das Uhren-Tag entfernt.
@alex, Metakommentar entfernen.

Antworten (2)

Ich würde einen Zufallszahlengenerator verwenden, um eine Zufallszahl zu generieren und sie dann basierend auf ihrem Wert einem Zustand zuzuweisen.

Wenn ich zum Beispiel eine Zufallszahl zwischen 1 und 100 erzeuge, dann geht sie unter 70 in Zustand 1, unter 80 in Zustand 2, unter 90 in Zustand 3 und unter 100 in Zustand 4.

Ich werde in diesem Beispiel die in SV eingebaute Zufallsfunktion verwenden, aber Sie können jeden beliebigen Zufallszahlengenerator für die Synthese verwenden.

Hier ist ein primitives Beispiel:

module tb;

   reg clk = 0;
   reg rst;


   // Clock definition
   localparam       clk_period = 10000; // 100 Mhz
   always begin
      clk   = #(clk_period/2) ~clk;
   end 

   // reset definition
   initial begin 
      rst = 1;
      #(25*clk_period);  
      @(posedge clk);      
      rst = 0;
   end


   enum      {STATE_1,STATE_2,STATE_3,STATE_4} state;
   reg [7:0] random_num;

   always@(posedge clk) begin
      if (rst == 1) begin
         random_num <= $random % 50 + 50;
         state <= STATE_1;
      end
      else begin
         random_num <= $random % 50 + 50;

         if (random_num < 70)
           state <= STATE_1;
         else if  (random_num < 80)
           state <= STATE_2;
         else if  (random_num < 90)
           state <= STATE_3;
         else if  (random_num < 100)
           state <= STATE_4;

      end
   end

endmodule
@Stacey-rst nicht deklariert.
Dies ist kein vollständiges Beispiel, es müsste in eine vorhandene Testbench integriert werden.
einverstanden. Wir müssen auch berücksichtigen, ob rst aktiv hoch oder aktiv niedrig sein kann. Nur vorschlagen.
Vollständigen Testbench-Code hinzugefügt und auf die Verwendung von $random umgestellt, da $urandom noch nicht von xilinx simulierbar ist.

Der einfachste Weg, dies zu implementieren, besteht darin, $random zu verwenden und mit vier Schwellenwerten zu vergleichen. $random gibt eine zufällige 32-Bit-Ganzzahl von 0 bis 2^32-1 zurück, also teilen Sie diese einfach in vier Teile auf, sehen Sie, in welchen Teil das Ergebnis fällt, und stellen Sie Ihr Signal entsprechend ein. Werten Sie dies aus, wann immer Sie möchten, dass sich der Signalpegel ändert - alle Taktzyklen oder n Taktzyklen oder bei einer Verzögerung, die unabhängig von der Uhr ist.