芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 8969|回复: 8

关于非阻塞赋值的问题

[复制链接]
  • TA的每日心情
    开心
    2018-9-15 10:23
  • 5

    主题

    8

    帖子

    35

    积分

    新手上路

    Rank: 2

    积分
    35
    发表于 2018-10-29 16:28:41 | 显示全部楼层 |阅读模式
    一般非阻塞赋值是在时钟的最后时刻赋值,就是说相当于延迟了一个周期,可是我仿真的时候,有时候延迟一个周期,有时候不延迟,这是怎么回事?
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 419

    主题

    771

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    15810
    QQ
    发表于 2018-10-29 17:00:34 | 显示全部楼层
    这个与你的testbench的信号赋值与时钟沿的对齐有关系。建议你贴个你觉得有问题的代码上来作为例子,我们辅助帮你分析
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-15 10:23
  • 5

    主题

    8

    帖子

    35

    积分

    新手上路

    Rank: 2

    积分
    35
     楼主| 发表于 2018-10-29 17:14:44 | 显示全部楼层

    1. always@(posedge mii_tx_clk or negedge Rst_n)
    2. if(!Rst_n)begin
    3.         mii_tx_data<=4'd0;
    4. end
    5. else begin
    6.         case(cnt)
    7.                 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15:
    8.                         mii_tx_data<=4'h5;
    9.                 16:
    10.                         mii_tx_data<=4'hd;
    11.                 //目的MAC地址
    12.                 17: mii_tx_data <=r_des_mac[43:40];
    13.                 18: mii_tx_data <=r_des_mac[47:44];
    14.                 19: mii_tx_data <=r_des_mac[35:32];
    15.                 20: mii_tx_data <=r_des_mac[39:36];
    16.                 21: mii_tx_data <=r_des_mac[27:24];
    17.                 22: mii_tx_data <=r_des_mac[31:28];
    18.                 23: mii_tx_data <=r_des_mac[19:16];
    19.                 24: mii_tx_data <=r_des_mac[23:20];
    20.                 25: mii_tx_data <=r_des_mac[11:8];
    21.                 26: mii_tx_data <=r_des_mac[15:12];
    22.                 27: mii_tx_data <=r_des_mac[3:0];
    23.                 28: mii_tx_data <=r_des_mac[7:4];
    24.                 //源MAC地址
    25.                 29: mii_tx_data <=r_src_mac[43:40];
    26.                 30: mii_tx_data <=r_src_mac[47:44];
    27.                 31: mii_tx_data <=r_src_mac[35:32];
    28.                 32: mii_tx_data <=r_src_mac[39:36];
    29.                 33: mii_tx_data <=r_src_mac[27:24];
    30.                 34: mii_tx_data <=r_src_mac[31:28];
    31.                 35: mii_tx_data <=r_src_mac[19:16];
    32.                 36: mii_tx_data <=r_src_mac[23:20];
    33.                 37: mii_tx_data <=r_src_mac[11:8];
    34.                 38: mii_tx_data <=r_src_mac[15:12];
    35.                 39: mii_tx_data <=r_src_mac[3:0];
    36.                 40: mii_tx_data <=r_src_mac[7:4];
    37.                 //以太网帧类型/长度
    38.                 41: mii_tx_data <=r_type_length[11:8];
    39.                 42: mii_tx_data <=r_type_length[15:12];
    40.                 43: mii_tx_data <=r_type_length[3:0];
    41.                 44: mii_tx_data <=r_type_length[7:4];
    42.                 //发送数据
    43.                 45: mii_tx_data <=fifo_rddata;
    44.                 //发送CRC 校验结果
    45.                 46: mii_tx_data <=CRC_Result[31:28];
    46.                 47: mii_tx_data <=CRC_Result[27:24];
    47.                 48: mii_tx_data <=CRC_Result[23:20];
    48.                 49: mii_tx_data <=CRC_Result[19:16];
    49.                 50: mii_tx_data <=CRC_Result[15:12];
    50.                 51: mii_tx_data <=CRC_Result[11:8];
    51.                 52: mii_tx_data <=CRC_Result[7:4];
    52.                 53: mii_tx_data <=CRC_Result[3:0];
    53.                 default:mii_tx_data<=4'd0;
    54.         endcase
    55. end
    56. 这是以太网的发送部分代码,我发现每次都是在仿真时刻的最后赋值的,比如cnt为1时,实际上是在2时刻才赋值
    57. always@(posedge mii_rx_clk or negedge Rst_n)
    58. if(!Rst_n)
    59.         leadcode<=64'h0000_0000_0000_0000;
    60. else begin
    61.         case(cnt)
    62.                 0:
    63.                         leadcode[59:56]<=mii_rx_data;
    64.                 1:
    65.                         leadcode[63:60]<=mii_rx_data;
    66.                 2:
    67.                         leadcode[51:48]<=mii_rx_data;
    68.                 3:
    69.                         leadcode[55:52]<=mii_rx_data;
    70.                 4:
    71.                         leadcode[43:40]<=mii_rx_data;
    72.                 5:
    73.                         leadcode[47:44]<=mii_rx_data;
    74.                 6:
    75.                         leadcode[35:32]<=mii_rx_data;
    76.                 7:
    77.                         leadcode[39:36]<=mii_rx_data;
    78.                 8:
    79.                         leadcode[27:24]<=mii_rx_data;
    80.                 9:
    81.                         leadcode[31:28]<=mii_rx_data;
    82.                 10:
    83.                         leadcode[19:16]<=mii_rx_data;
    84.                 11:
    85.                         leadcode[23:20]<=mii_rx_data;
    86.                 12:
    87.                         leadcode[11:8]<=mii_rx_data;
    88.                 13:
    89.                         leadcode[15:12]<=mii_rx_data;
    90.                 14:
    91.                         leadcode[3:0]<=mii_rx_data;
    92.                 15:
    93.                         leadcode[7:4]<=mii_rx_data;
    94.                 default:leadcode<=leadcode;
    95.         endcase
    96. end
    97. 这是以太网接收的部分代码,我发现是立即赋值的
    复制代码

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-6-29 15:57
  • 13

    主题

    246

    帖子

    3625

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    3625
    发表于 2018-10-29 20:08:23 | 显示全部楼层
    学习了学习了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-11-20 10:36
  • 0

    主题

    14

    帖子

    421

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    421
    发表于 2018-10-29 20:52:09 | 显示全部楼层
    建议仿真时候错开数据沿跟时钟沿,然后再分析。具体操作可以参看芯路恒得串口那讲仿真例子
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 419

    主题

    771

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    15810
    QQ
    发表于 2018-10-29 20:54:31 | 显示全部楼层
    因为你的接收部分进行仿真时,mii_rx_data由tb驱动,而在tb中驱动该数据时,并非和寄存器变化一样总是滞后于时钟上升沿一段时间,所以这里当clk上升沿出现时,你的leadcode去取mii_rx_data的值的时候,而此时mii_rx_data立即发生了变化,Modelsim认为此上升沿时候mii_rx_data的值已经变化完成,是新的值了,就将新值直接赋值给leadcode了。如果还有不明白的,可以看小小梅哥的这个视频:
    https://pan.baidu.com/s/10rtexhn0V4Xy5CAs9rWGrg
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-6-29 15:57
  • 13

    主题

    246

    帖子

    3625

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    3625
    发表于 2018-10-30 07:27:41 | 显示全部楼层
    admin 发表于 2018-10-29 20:54
    因为你的接收部分进行仿真时,mii_rx_data由tb驱动,而在tb中驱动该数据时,并非和寄存器变化一样总是滞后 ...

    这是 真爱啊,梅哥还特意录制了视频
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-15 10:23
  • 5

    主题

    8

    帖子

    35

    积分

    新手上路

    Rank: 2

    积分
    35
     楼主| 发表于 2018-10-30 09:04:36 | 显示全部楼层
    admin 发表于 2018-10-29 20:54
    因为你的接收部分进行仿真时,mii_rx_data由tb驱动,而在tb中驱动该数据时,并非和寄存器变化一样总是滞后 ...

    我觉得是cnt的原因,滞后是因为时钟上升沿采到cnt的滞后
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 419

    主题

    771

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    15810
    QQ
    发表于 2018-10-30 10:20:31 | 显示全部楼层
    白小白 发表于 2018-10-30 09:04
    我觉得是cnt的原因,滞后是因为时钟上升沿采到cnt的滞后

    发送部分你的仿真结果滞后一拍是正确的,接收部分没有滞后一拍是错误的。因为接收的代码仿真时候mii_rx_data是tb中直接赋值的,不是由寄存器驱动的,这种方式没有建立时间,保持时间的概念
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-3-29 17:58 , Processed in 0.119979 second(s), 35 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表