• 如何在interface中处理DUT中的inout信号


            如果在dut中声明为inout类型的信号,处理的方式如下:
            例如dut中声明的信号为inout  [7:0] data;
            在interface声明3个信号,一个是wire型的信号: wire  logic [7:0] data;一个是将外部信号赋值给data的 input 类型的信号:logic [7:0] in_data; 第三个是将data赋值给外部的信号:logic [7:0] out_data; 在interface中利用条件语句将外部变量赋值给data,将data赋值给外部变量,这里注意当外部变量不向data赋值时,需要将data赋值为高组态;当data不向外部变量赋值时,需要将外部变量赋值为0。赋值示例如下:

    1. assign data=(a==1) ?in_data :'hzz;
    2. assign out_data=(a==0) ?data :'h00;

    完整的示例如下:

    1. module top(clk,a,data,rst,addr);
    2. input clk,a,rst;
    3. inout [7:0] data;
    4. input [7:0] addr;
    5. logic [7:0] data_reg ,data_reg_reg;
    6. always @(posedge clk or negedge rst)
    7. if(!rst)
    8. begin
    9. data_reg<=0; data_reg_reg<=0;
    10. end
    11. else if (a==1)
    12. data_reg<=data;
    13. else if (a==0)
    14. begin
    15. //data_reg<=data_reg+1;
    16. data_reg_reg<=data_reg_reg+2;
    17. end
    18. assign data= (a==0) ? data_reg_reg : 'hzz;
    19. endmodule
    20. interface simple_bus;
    21. logic clk,a,rst;
    22. wire logic [7:0] data;
    23. logic [7:0] addr;
    24. logic [7:0] in_data;
    25. logic [7:0] out_data;
    26. assign data=(a==1) ?in_data :'hzz;
    27. assign out_data=(a==0) ?data :'h00;
    28. endinterface
    29. class testbench ;
    30. virtual simple_bus this_s;
    31. function new (virtual simple_bus s);
    32. this_s=s;
    33. endfunction
    34. task assignment;
    35. repeat(10) @(posedge this_s.clk);
    36. //force
    37. this_s.a=1;
    38. this_s.in_data=66;
    39. repeat (10) @(posedge this_s.clk);
    40. //force
    41. this_s.a=1;
    42. this_s.in_data=33;
    43. repeat(10) @(posedge this_s.clk);
    44. this_s.a=0;
    45. // force this_s.data='h77;
    46. endtask
    47. endclass
    48. module tb;
    49. simple_bus bus();
    50. top inst(.clk(bus.clk),.a(bus.a) ,.rst(bus.rst), .data(bus.data) ,.addr(bus.addr) );
    51. testbench class_test=new(bus);;
    52. //class_test =new(bus);
    53. initial
    54. begin
    55. bus.clk=0;
    56. bus.rst=0;
    57. #1000;
    58. bus.rst=1;
    59. class_test.assignment;
    60. //bus.a=0;
    61. /* #10000;
    62. bus.a=1; force bus.data='d8;
    63. #100; force bus.data='d3;
    64. #100 ; force bus.data='d7;
    65. #10000;
    66. bus.a=0; */
    67. end
    68. always #5 bus.clk= ~bus.clk;
    69. endmodule

    注意:
            不能在class中的task中向wire型变量使用force强制赋值,或者不能使用assign向wire变量连续赋值。
            不能在tb中的initial 语句中对interface中的wire型变量强制赋值。

  • 相关阅读:
    selenium 自动化测试——环境搭建
    JavaScript公共组件父子依赖调用及子校验父条件问题解决
    柯桥生活口语学习,英语中初次见面,除了Nice to meet you,还能说什么?
    mysql 索引使用教程
    JS基础小练习
    三翼鸟:产品不会变,场景实时变
    STM32 ~ GPIO不同模式之间的区别与实现原理
    热敏性聚N-乙烯基异丁酰胺(PNVIBA)/聚(N—乙烯基异丁酰胺)接枝聚苯乙烯微球的研究
    Java开发学习(二十三)----SpringMVC入门案例、工作流程解析及设置bean加载控制
    【Overload游戏引擎细节分析】standard材质Shader
  • 原文地址:https://blog.csdn.net/qq_33300585/article/details/134428873