SystemVerilog 中需要什么类型的可变移位运算符?
What type of variable shift operator needs in SystemVerilog?
我有一个 8 位有符号变量 A 和一个 3 位值 n。我想在 always 语句中将运算符移位 n 次,但它不起作用,输出为 x。
reg signed [7:0] A = //something;
reg [2:0] n = 3'b//something
always @(A, n) begin
w = 8'b0;
w = A >> n;
那么需要什么样的变量移位运算符呢?以及如何将 n 转换为该类型?
移位运算符需要 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;
参数的类型不是您遇到的问题。问题是 always 块没有得到 运行。 A
和 n
的值没有改变,因此 always @
永远不会变成 运行。如果这是一个真实的程序,你就不会有问题,因为这些信号会从某个地方驱动并传播到这个块。无论如何,对于 n
任何整数值都可以,您只需要在模拟过程中更改它即可。要查看它永远不会 运行 你可以在 always 块中使用 $display
然后你会看到它何时 运行s.
当我运行以下内容时:
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 不更改输入的情况下执行。
我有一个 8 位有符号变量 A 和一个 3 位值 n。我想在 always 语句中将运算符移位 n 次,但它不起作用,输出为 x。
reg signed [7:0] A = //something;
reg [2:0] n = 3'b//something
always @(A, n) begin
w = 8'b0;
w = A >> n;
那么需要什么样的变量移位运算符呢?以及如何将 n 转换为该类型?
移位运算符需要 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;
参数的类型不是您遇到的问题。问题是 always 块没有得到 运行。 A
和 n
的值没有改变,因此 always @
永远不会变成 运行。如果这是一个真实的程序,你就不会有问题,因为这些信号会从某个地方驱动并传播到这个块。无论如何,对于 n
任何整数值都可以,您只需要在模拟过程中更改它即可。要查看它永远不会 运行 你可以在 always 块中使用 $display
然后你会看到它何时 运行s.
当我运行以下内容时:
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 不更改输入的情况下执行。