微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > modelsim仿真异常现象

modelsim仿真异常现象

时间:10-02 整理:3721RD 点击:

刚做个仿真,出现了一个很奇怪的现象,不知道怎么回事就来求助大家了。
代码如下,功能也就是将输入的I/Q数据进行低通滤波之后对滤波器输出数据进行截位:

  1. ch2lpf12m ch2lpf12m_inst0(
  2.         .clk(clk_122p88),
  3.         .reset_n(fir_reset_n),
  4.         .ast_sink_data(indata_i),
  5.         .ast_sink_valid(1'd1),
  6.         .ast_source_ready(1'd1),
  7.         .ast_sink_error(2'd0),
  8.         .ast_source_data(source_data_i),
  9.         .ast_sink_ready(ast_sink_ready_i),
  10.         .ast_source_valid(source_valid_i),
  11.         .ast_source_error()
  12.         );

  13. ch2lpf12m ch2lpf12m_inst1(
  14.         .clk(clk_122p88),
  15.         .reset_n(fir_reset_n),
  16.         .ast_sink_data(indata_q),
  17.         .ast_sink_valid(1'd1),
  18.         .ast_source_ready(1'd1),
  19.         .ast_sink_error(2'd0),
  20.         .ast_source_data(source_data_q),
  21.         .ast_sink_ready(ast_sink_ready_q),
  22.         .ast_source_valid(source_valid_q),
  23.         .ast_source_error()
  24.         );

  25. assign source_data_i_r0 = (source_data_i[34]==1'b0)?(source_data_i+35'h10000):(source_data_i+35'h0ffff);
  26. assign source_data_q_r0 = (source_data_q[34]==1'b0)?(source_data_q+35'h10000):(source_data_q+35'h0ffff);

  27. //对实部信号、虚部信号进行采样输出

  28. always @(posedge clk_122p88)
  29. begin
  30.         if(source_valid_i == 1'b1)
  31.                 begin
  32.                         source_data_i_r <= {source_data_i_r0[34],source_data_i_r0[31:17]};
  33.                         source_data_q_r <= {source_data_q_r0[34],source_data_q_r0[31:17]};
  34.                 end
  35.         else
  36.                 begin
  37.                         source_data_i_r <= source_data_i_r;
  38.                         source_data_q_r <= source_data_q_r;
  39.                 end
  40. end

复制代码

对应的testbench如下,产生一个122.88M的时钟信号及输入的I/Q数据信号indata_i/q:

  1. parameter cycle = 8138;

  2. initial                                                
  3. begin         
  4.                 clk_122p88 = 1'b0;
  5.                 reset_n = 1'b0;
  6.                 # 20000 reset_n = 1'b1;                                                           
  7. $display("Running testbench");                       
  8. end                                                   

  9. always  #(cycle/2)        clk_122p88 = ~clk_122p88;

  10. initial
  11. begin
  12.         forever
  13.                 begin
  14.                         @(posedge clk_122p88);
  15.                         indata_i = $random;
  16.                         indata_q = $random;
  17.                 end                                             
  18. end

复制代码

仿真结果非常奇怪,输出source_data_i/q_r仍然携带了一些无用的信号,但是明明源代码中使用source_valid_i对滤波器输出数据进行了采样,可是没起到什么作用。并且那些无效的数据也不是在时钟上升沿变化的。
代码中以时钟沿为触发条件对输出source_data_i/q_r信号进行赋值,可仿真图形中显示输出的该信号数据值的变化并不是在时钟上升沿(也不在下降沿),似乎和时钟没什么关系。为此我在testbench中将截位前的数据接出来在testbench中,以时钟上升沿为触发条件进行截位,查看波形一切正常。但是对应的那个always快放在源文件中进行仿真,输出的时序图却出现了异常(不是偶然现象,我试过很多次了,真是见鬼了)
不方便上图,要不然大家可以更清楚些了,不知道我有没有把结果描述清楚。
有图了,如下:


有没有哪位大神给我解释下啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top