什么类型的变量运算符在SystemVerilog中需要?
问题描述:
我有一个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;