2017-04-11 6 views
1

Ich habe eine 8-Bit-Vorzeichenvariable A und einen 3-Bit-Wert n. Ich möchte Operator n Zeiten in einer Anweisung immer verschieben, aber es funktioniert nicht und Ausgabe ist x.Welche Art von Variable Shift-Operator benötigt SystemVerilog?

reg signed [7:0] A = //something; 
reg [2:0] n = 3'b//something 
always @(A, n) begin 
w = 8'b0; 
w = A >> n; 

Also welche Art von Variable Shift-Operator benötigt? und wie kann ich n zu diesem Typ konvertieren?

Antwort

2

Die Art des Arguments ist nicht das Problem, das Sie mit integer Typ-Signal und weisen erklären. Das Problem ist, dass der Always Block nicht ausgeführt wird. Die Werte von A und n ändern sich nicht und daher wird always @ nicht ausgeführt. Wenn dies ein echtes Programm wäre, hätten Sie kein Problem, da diese Signale von irgendwoher kommen und sich zu diesem Block ausbreiten würden. In jedem Fall ist jeder Integralwert für n in Ordnung, Sie müssen ihn nur während der Simulation ändern. Um zu sehen, dass es nie ausgeführt wurde, könnten Sie einen innerhalb des Blocks immer verwenden und Sie werden sehen, wenn es läuft.

Wenn ich laufen die folgenden:

module test; 
    reg signed [7:0] A = 'h17; 
    reg [2:0] n = 3'b010; 
    reg signed [7:0] w; 

    always @(A, n) begin 
    w = A >> n; 
    $display("%0t: always has been run", $time); 
    end 

    initial $monitor("%X %d %X", A, n, w); 
endmodule 

Ausgang:

17 2 xx 

Wenn ich stattdessen den folgenden Code verwenden, dann bekomme ich die erwartete Antwort:

module test; 
    reg signed [7:0] A; 
    reg [2:0] n; 
    reg signed [7:0] w; 

    initial begin 
    #10; 
    A = 'h17; 
    n = 3'b010; 
    end 

    always @(A, n) begin 
    w = A >> n; 
    $display("%0t: always has been run", $time); 
    end 

    initial $monitor("%X %d %X", A, n, w); 
endmodule 

Ausgang:

xx x xx 
10: always has been run 
17 2 05 

Die andere Option ist, dass, wenn Sie einen SystemVerilog-Simulator haben, dann können Sie nur always_comb verwenden, die im Gegensatz zu den always @ es ohne Änderungen an den Eingängen zum Zeitpunkt ausführt 0

0

Für den Schichtbetreiber ist ein Typ integer erforderlich.

So konvertieren Sie auf ganzzahlige int'(n)

verwenden können, oder Sie können es, wie

reg signed [7:0] A = ;//something; 
reg [2:0] n = 3'b;//something 
integer n_int; 

    always @(A, n) begin 
     n_int = n; 
     w = 8'b0; 
     w = A >> n_int; 
Verwandte Themen