2017-04-11 109 views
1

我有一個8位有符號變量A和一個3位值n。我想在總是聲明中將運算符轉移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

類型的參數是不是您所遇到的問題。問題是always塊沒有運行。 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_comb它不像always @將在時間上沒有輸入的變化執行0

0

對於移位操作員需要integer類型。

要轉換成整數,你可以使用int'(n)

或者,你可以聲明integer類型的信號,並分配給它,就像

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;