繁体   English   中英

如何在系统Verilog中生成随机数的触发器?

[英]How to generate random number of flops in system verilog?

我正在尝试在0-10翻牌之间添加随机数的翻牌。 但是在随机数为0时面临一个问题。如果随机值为0,则不应忽略期望的数据。请提出您的意见。

码:

module tx_delay_bmod_1(clk, i_tx_data,o_tx_data);
parameter CH_NUM = 4;

input clk;
input  i_tx_data;
output reg  o_tx_data;
int DELAY;
bit o_tx_data_tmp[100];

  int random_flop_cnt;
  int seed_num,ntb_random_seed;

  initial
     random_flop_cnt = (($urandom(CH_NUM )%10) + ((CH_NUM/4)*10));


always@(negedge clk) begin
if (random_flop_cnt==0) o_tx_data = i_tx_data; 
    else begin
      for(int i=0; i<random_flop_cnt; i++) begin
                if(i==0)
                o_tx_data_tmp[0] <= i_tx_data;
                else o_tx_data_tmp[i] <= o_tx_data_tmp[i-1];
                if(i==(random_flop_cnt-1))
                 o_tx_data <= o_tx_data_tmp[i];
      end 
      end
   end 

flop_cnt == 0您仍然会得到一个翻牌,因为您已将其编码为对时钟敏感的always块(因此,使用此1分配将合成为一个翻牌)。 您可以考虑将其替换为generate块内的直接assign ,即, if 0 -> use assign else -> use an always block (块级解决方案)。

或者,如果没有延迟,则无需实例化此块,则可以约束flop_cnt生成的数字大于0 同样,您根本不会实例化此块,只需以不同的方式路由顶级信号(体系结构解决方案)。

正如Raz所说:您在时钟代码中拥有一个寄存器(并且您使用'='而不是'<='。)您定义了100位并仅链接所需的位。 这意味着其余部分未使用,并且已被优化。

在always块内根本没有循环。 知道未使用的寄存器被删除后,您可以将它们全部链接起来并选择输出:

bit [99:0] o_tx_data_tmp;

always@(negedge clk)
    o_tx_data_tmp <= {o_tx_data_tmp[98:0],i_tx_data}; 

assign o_tx_data = random_flop_cnt==0 ? i_tx_data : o_tx_data_tmp[random_flop_cnt-1];

主要优点是可读性,尤其是当您做一些不寻常的事情(使用随机数的寄存器)时,很容易使任意阅读器感到困惑。

我假设您知道这仅是行为上的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM