我有一個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轉換爲該類型?
我有一個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轉換爲該類型?
類型的參數是不是您所遇到的問題。問題是always塊沒有運行。 A
和n
的值不會更改,因此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
對於移位操作員需要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;