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).
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
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.
alex.forencich
alex.forencich
neid_intelligenz
neid_intelligenz