2013-11-14 47 views
0

我已经编写了以下工作代码来计算使能信号。一个或函数的SystemVerilog参数

logic   l_en [0:N-1]; 
logic [0:N-1] l_output_grant [0:M-1]; 

always_comb begin 
    for (int i=0; i<N; i++) begin 
    l_en[i] = |{l_output_grant[0][i], 
        l_output_grant[1][i], 
        l_output_grant[2][i], 
        l_output_grant[3][i], 
        l_output_grant[4][i]}; 
    end 
end 

我现在试图改变参数[0]到[4]的代码。我试了下面的代码

logic   l_en [0:N-1]; 
logic [0:N-1] l_output_grant [0:M-1]; 

always_comb begin 
    for(int i=0; i<N; i++) begin 
    for(int j=0; j<M; j++) begin 
     l_en[i] = |l_output_grant[j][i]; 
    end 
    end 
end 

哪个不行。我认为这是因为它重新计算j的每次迭代,因此如果[j + 1] [i]为低,则清除由[j] [i]分配的启用。

我可以用其他方法做这个吗?

+1

l_en和l_output_grant是否也参数化为N和M?或者他们的声明是独立的?请出示他们的声明。 –

+0

是的。我编辑过。 – user2646276

回答

1

l_en[i] = |l_output_grant[j][i]覆盖预览分配。另外,|l_output_grant[j][i]是一个按位或运算符的信号位,它什么都不做。

对于所需的功能,请使用|=按位运算符; l_en |= l_output_grant[j]。或者,使用传统的Verilog方法l_en = l_en | l_output_grant[j]。请记住在for循环前通过将l_en分配给全零来清除旧值。未能清除这些值将会创建锁存器并阻止从以往发生的任何高到低的转换。由于宽度匹配for(i=...)循环是不需要的。

always_comb begin 
    l_en = '0; // all bits to zero 
    for(int j=0; j<M; j++) begin 
    l_en |= l_output_grant[j]; 
    // equivalent to: l_en[0:N-1] = l_en[0:N-1] | l_output_grant[j][0:N-1]; 
    end 
end 

注意:使用Verilog的风格,如果合成器不支持|=运营商。如果支持SystemVerilog,模拟器将支持操作员。

+0

谢谢,虽然一目了然,但我不认为代码需要进行转置。我的意图是,我有N个使能信号,并且如果M个打包输出授权中的任何一个的位都高,那么我的使能是高的。我可能是错的,但我明天会去检查。谢谢。 – user2646276

+0

它的工作原理,请参阅示例:http://www.edaplayground.com/s/6/379。由于伊卡洛斯的限制,我必须删除一些SV。重点工作。 – Greg

+0

干杯,我看到你现在做了什么,但不幸的是,它不会使用我有的信号定义,因为l_en不是一个紧凑的数字。 – user2646276

相关问题