在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 851|回复: 1

[讨论] interface连接dut后仿真出现dut信号被多重驱动的问题

[复制链接]
发表于 2023-8-17 14:31:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 replaceorstay 于 2023-8-17 14:47 编辑

dut很简单,是一个可变进制计数器,用输入信号ceil作为可计数的最大值,如下:




  1. module cnt_ceil(
  2.   input        clk,
  3.   input        rst_n,
  4.   input        en,
  5.   input  [3:0] ceil,
  6.   output [3:0] cnt,
  7.   output       co
  8.         );
  9.   reg [3:0] cnt_reg;
  10.   assign cnt = cnt_reg;
  11.   assign co  = (cnt==ceil) && en;
  12.   always@(posedge clk,negedge rst_n) begin
  13.     if(!rst_n)
  14.       cnt_reg <= 4'b0000;
  15.     else
  16.       if(en)
  17.         if(cnt_reg>=ceil)
  18.           cnt_reg <= 4'b0000;
  19.         else
  20.           cnt_reg <= cnt_reg + 1'b1;
  21.   end
  22. endmodule


复制代码


interface如下:





  1. interface dut_interface(input logic clk);
  2.   logic       rst_n;
  3.   logic       en;
  4.   logic [3:0] ceil;
  5.   logic [3:0] cnt;
  6.   logic       co;
  7.   modport DUT (
  8.     input rst_n,
  9.     input en,
  10.     input ceil,
  11.     output cnt,
  12.     output co,
  13.     input clk
  14.   );
  15. endinterface


复制代码
在模块dut_top中例化cnt_ceil并连接interface:




  1. module dut_top(dut_interface.DUT ifc);
  2.         cnt_ceil cnt_ceil_0(
  3.                 .clk   (ifc.clk),
  4.                 .rst_n (ifc.rst_n),
  5.                 .en    (ifc.en),
  6.                 .ceil  (ifc.ceil),
  7.                 .cnt   (ifc.cnt),
  8.                 .co    (ifc.co)
  9.         );
  10. endmodule


复制代码
在测试平台顶层模块top中例化dut_top和一个interface实例并连接:




  1. //省略include语句
  2. module top;
  3.         bit clk;
  4.         dut_interface ifc(clk);

  5.         dut_top dut(ifc);
  6.         initial begin
  7.                 clk = 1'b0;
  8.                 forever #1 clk=~clk;
  9.         end
  10.         initial begin
  11.                 //省略其余uvm语句
  12.                 run_test();
  13.         end
  14. endmodule


复制代码



后来我在interface里加了一个时钟块cnt_ceil_cb,在modport DUT中添加该时钟块,在dut_top里用ifc.cnt_ceil_cb.cnt和ifc.cnt_ceil_cb.co连接端口,发现没有报多重驱动的错误,仿真正常,只是由于在时钟块内的信号,output信号默认#0,而且需要经过clk同步,所以在monitor里通过virtual interface获得当前时钟沿的cnt和co比实际的产生晚了一个时钟周期。
clocking block如下:




  1. clocking cnt_ceil_cb @(posedge clk);
  2.   output cnt,co;
  3.         endclocking


复制代码
可是对于dut一般是不用时钟块连接的。

 楼主| 发表于 2023-8-18 12:28:00 | 显示全部楼层
本帖最后由 replaceorstay 于 2023-8-18 12:29 编辑

我觉得还是没有将interface和cnt_ceil直接相连而是仅仅在实例化模块时连接端口的问题。
除了在cnt_ceil模块里的信号改用ifc.xxx的方式外貌似还可以在dut_top里使用以下的方式:




  1. module dut_top(dut_interface.DUT ifc);
  2.   logic cnt;
  3.   logic co;
  4.   always@(*) begin
  5.     ifc.cnt = cnt;
  6.     ifc.co  = co;
  7.   end
  8.   cnt_ceil cnt_ceil_0(
  9.     .clk   (ifc.clk),
  10.     .rst_n (ifc.rst_n),
  11.     .en    (ifc.en),
  12.     .ceil  (ifc.ceil),
  13.     .cnt   (cnt),
  14.     .co    (co)
  15.     );
  16. endmodule



复制代码
可是对于input信号,为什么没问题呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-8 14:15 , Processed in 0.014394 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表