2017-04-11 45 views
1

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

回答

2

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

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; 
相关问题