如何在系统verilog中生成随机数的flops?

时间:2018-03-19 14:54:22

标签: verilog 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 

2 个答案:

答案 0 :(得分:0)

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

如果没有延迟,如果没有必要实例化此块,您可以限制flop_cnt代产生大于0的数字。此外,您根本不会实例化此块,只是以不同方式路由顶层信号(架构解决方案)。

答案 1 :(得分:0)

正如Raz所说:你在时钟代码中有一个寄存器(你使用&#39; =&#39;而不是&#39;&lt; =&#39;对于那个。)你定义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];

主要优点是可读性,特别是当您做一些与众不同的事情(使用随机数量的寄存器)时,这可能会轻易混淆任意读者。

我假设你知道这只是行为。