2017-04-11 24 views
1

私は8ビットの符号付き変数Aと3ビットの値nを持っています。私は演算子をalwaysステートメントでn回シフトしたいが、それはうまく動作せず、出力はxである。SystemVerilogで必要な可変シフト演算子の種類は?

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

どのようなタイプの可変シフト演算子が必要ですか?どのようにnをその型に変換できますか?

答えて

2

のように、引数の型は、あなたが持っている問題ではありません、integerタイプの信号を宣言し、それに割り当てることができ整数に変換さ

。問題は、常時ブロックが実行されていないことです。 Anの値は変更されていないため、always @は実行されません。これが実際のプログラムであれば、これらの信号はどこかから駆逐されてこのブロックに伝播するので、問題はありません。いずれにしても、積分値はnで問題ありません。シミュレーション中に変更する必要があります。実行されたことがないことを確認するには、alwaysブロック内に$displayを使用して、実行時を確認します。

私は次のように実行すると:

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 

出力:代わりに、私は次のコードを使用している場合

17 2 xx 

を、そして私が期待される応答を取得:

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 

出力:

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

他のオプションは、SystemVerilogのシミュレータを持っている場合は、あなただけalways @とは異なり、それは時に入力に変更することなく実行されalways_combを使用することができるということです0

0

シフト演算子の場合は、integerタイプが必要です。あなたはint'(n)

を使用するかは

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; 
関連する問題