SystemVerilog中需要什么类型的变量移位操作符?

时间:2017-04-11 22:18:26

标签: verilog system-verilog digital-logic

我有一个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转换为该类型?

2 个答案:

答案 0 :(得分:2)

参数的类型不是您遇到的问题。问题是always块没有运行。 An的值不会发生变化,因此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;