您当前的位置:五五电子网电子知识电子学习基础知识电脑-单片机-自动控制使用SignalTap II观察reg与wire值 正文
使用SignalTap II观察reg与wire值

使用SignalTap II观察reg与wire值

点击数:7970 次   录入时间:06-23 08:02:01   整理:http://www.55dianzi.com   电脑-单片机-自动控制
 

(

www.55dianzi.com

观察wire
同样的,在SignalTap II观察wire时,有时也会因为被QUARTus II优化掉而无法用SignalTap II观察。

SignalTapII_wire_not_keep.v / Verilog

  1. module SignalTapII_wire_not_keep (  
  2.   input        ICLK,  
  3.   input        iRST_N,  
  4.   output [3:0] oCNT  
  5. );  
  6.  
  7. wire [3:0] Cnt;    
  8. reg  [3:0] cnt;  
  9.  
  10. assign Cnt = cnt;  
  11. assign oCNT = Cnt;  
  12.  
  13. always@(posedge iCLK, negedge iRST_N) begin  
  14.   if (!iRST_N)  
  15.     cnt <= 4'h0;  
  16.   else 
  17.     cnt <= cnt + 4'h1;  
  18. end  
  19.  
  20. endmodule 


7行
wire [3:0] Cnt;

假设我想用SignalTap II去观察Cnt这个wire。

signaltap2_reg4 

Cnt都是0,显然不合理,表示SignalTap II无法capture cnt这个wire的值。为什么会这样呢?

因为Cnt这个wire已经被Quartus II优化不见了!!

不过有时为了debug方便,我们就是想观察这种wire,有办法让Quartus II暂时不要启动最佳化吗?

SignalTapII_wire_keep.v / Verilog

  1. module SignalTapII_wire_keep (  
  2.   input        iCLK,  
  3.   input        iRST_N,  
  4.   output [3:0] oCNT  
  5. );  
  6.  
  7. wire [3:0] Cnt /*synthesis keep*/;    
  8. reg  [3:0] cnt;  
  9.  
  10. assign Cnt = cnt;  
  11. assign oCNT = Cnt;  
  12.  
  13. always@(posedge iCLK, negedge iRST_N) begin  
  14.   if (!iRST_N)  
  15.     cnt <= 4'h0;  
  16.   else 
  17.     cnt <= cnt + 4'h1;  
  18. end  
  19.  
  20. endmodule  


7行
wire [3:0] Cnt /*synthesis keep*/; 

多了/*synthesis keep*/这个synthesis attribute,指示Quartus II不要对Cnt做最佳化,保留此wire以供SignalTap II观察,注意必须写在分号前面,不能如下写在分号后面。
wire [3:0] Cnt;/*synthesis keep*/ //错  


编译后,SignalTap II就能顺利的观察到Cnt的值!!重点是不需改top module的interface,只需对想观察的wire加上synthesis attribute即可。

signaltap2_reg5

Quartus II也支援Verilog 2001的語法

  1. module SignalTapII_wire_keep (  
  2.   input        iCLK,  
  3.   input        iRST_N,  
  4.   output [3:0] oCNT  
  5. );  
  6.  
  7. // Verilog 2001  
  8. (*keep*) wire [3:0] Cnt;  
  9. reg  [3:0] cnt;  
  10.  
  11. assign Cnt = cnt;  
  12. assign oCNT = Cnt;  
  13.  
  14. always@(posedge iCLK, negedge iRST_N) begin  
  15.   if (!iRST_N)  
  16.     cnt <= 4'h0;  
  17.   else 
  18.     cnt <= cnt + 4'h1;  
  19. end  
  20.  
  21. endmodule  


8行
(*keep*) wire [3:0] Cnt;

这是Verilog 2001的语法,Quartus II 8.0也能看得懂。

结语
关于避免Quartus II优化reg,/*synthesis noprune*/与/*synthesis preserve*/还是有些差异,程序写到很大时,可能一时很难决定要用哪一个attribute,可以交替试试看,反正1/2的机会,总会对一个。会使用synthesis attribute之后,总算解掉长久以来,无法用SignalTap II观察reg与wire的老问题。

(

www.55dianzi.com

观察wire
同样的,在SignalTap II观察wire时,有时也会因为被QUARTus II优化掉而无法用SignalTap II观察。

SignalTapII_wire_not_keep.v / Verilog

  1. module SignalTapII_wire_not_keep (  
  2.   input        ICLK,  
  3.   input        iRST_N,  
  4.   output [3:0] oCNT  
  5. );  
  6.  
  7. wire [3:0] Cnt;    
  8. reg  [3:0] cnt;  
  9.  
  10. assign Cnt = cnt;  
  11. assign oCNT = Cnt;  
  12.  
  13. always@(posedge iCLK, negedge iRST_N) begin  
  14.   if (!iRST_N)  
  15.     cnt <= 4'h0;  
  16.   else 
  17.     cnt <= cnt + 4'h1;  
  18. end  
  19.  
  20. endmodule 


7行
wire [3:0] Cnt;

假设我想用SignalTap II去观察Cnt这个wire。

signaltap2_reg4 

Cnt都是0,显然不合理,表示SignalTap II无法capture cnt这个wire的值。为什么会这样呢?

因为Cnt这个wire已经被Quartus II优化不见了!!

不过有时为了debug方便,我们就是想观察这种wire,有办法让Quartus II暂时不要启动最佳化吗?

SignalTapII_wire_keep.v / Verilog

  1. module SignalTapII_wire_keep (  
  2.   input        iCLK,  
  3.   input        iRST_N,  
  4.   output [3:0] oCNT  
  5. );  
  6.  
  7. wire [3:0] Cnt /*synthesis keep*/;    
  8. reg  [3:0] cnt;  
  9.  
  10. assign Cnt = cnt;  
  11. assign oCNT = Cnt;  
  12.  
  13. always@(posedge iCLK, negedge iRST_N) begin  
  14.   if (!iRST_N)  
  15.     cnt <= 4'h0;  
  16.   else 
  17.     cnt <= cnt + 4'h1;  
  18. end  
  19.  
  20. endmodule  

上一页  [1] [2] [3]  下一页


本文关键字:暂无联系方式电脑-单片机-自动控制电子学习 - 基础知识 - 电脑-单片机-自动控制

《使用SignalTap II观察reg与wire值》相关文章>>>