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 块没有得到 运行。 An 的值没有改变,因此 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 不更改输入的情况下执行。