我有一个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转换为该类型?
答案 0 :(得分:2)
参数的类型不是您遇到的问题。问题是always块没有运行。 A
和n
的值不会发生变化,因此always @
无法运行。如果这是一个真正的程序,你就不会有问题,因为这些信号会从某个地方驱动并传播到这个块。在任何情况下,任何积分值都适用于n
,您只需要在模拟过程中对其进行更改。要查看它从未运行过,您可以在始终阻止中使用$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时没有改变输入而执行。
答案 1 :(得分: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;