(
www.55dianzi.com
观察wire
同样的,在SignalTap II观察wire时,有时也会因为被QUARTus II优化掉而无法用SignalTap II观察。
SignalTapII_wire_not_keep.v / Verilog
- module SignalTapII_wire_not_keep (
- input ICLK,
- input iRST_N,
- output [3:0] oCNT
- );
- wire [3:0] Cnt;
- reg [3:0] cnt;
- assign Cnt = cnt;
- assign oCNT = Cnt;
- always@(posedge iCLK, negedge iRST_N) begin
- if (!iRST_N)
- cnt <= 4'h0;
- else
- cnt <= cnt + 4'h1;
- end
- endmodule
7行
wire [3:0] Cnt;
假设我想用SignalTap II去观察Cnt这个wire。
Cnt都是0,显然不合理,表示SignalTap II无法capture cnt这个wire的值。为什么会这样呢?
因为Cnt这个wire已经被Quartus II优化不见了!!
不过有时为了debug方便,我们就是想观察这种wire,有办法让Quartus II暂时不要启动最佳化吗?
SignalTapII_wire_keep.v / Verilog
- module SignalTapII_wire_keep (
- input iCLK,
- input iRST_N,
- output [3:0] oCNT
- );
- wire [3:0] Cnt /*synthesis keep*/;
- reg [3:0] cnt;
- assign Cnt = cnt;
- assign oCNT = Cnt;
- always@(posedge iCLK, negedge iRST_N) begin
- if (!iRST_N)
- cnt <= 4'h0;
- else
- cnt <= cnt + 4'h1;
- end
- 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即可。
Quartus II也支援Verilog 2001的語法
- module SignalTapII_wire_keep (
- input iCLK,
- input iRST_N,
- output [3:0] oCNT
- );
- // Verilog 2001
- (*keep*) wire [3:0] Cnt;
- reg [3:0] cnt;
- assign Cnt = cnt;
- assign oCNT = Cnt;
- always@(posedge iCLK, negedge iRST_N) begin
- if (!iRST_N)
- cnt <= 4'h0;
- else
- cnt <= cnt + 4'h1;
- end
- 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的老问题。
观察wire
同样的,在SignalTap II观察wire时,有时也会因为被QUARTus II优化掉而无法用SignalTap II观察。
SignalTapII_wire_not_keep.v / Verilog
- module SignalTapII_wire_not_keep (
- input ICLK,
- input iRST_N,
- output [3:0] oCNT
- );
- wire [3:0] Cnt;
- reg [3:0] cnt;
- assign Cnt = cnt;
- assign oCNT = Cnt;
- always@(posedge iCLK, negedge iRST_N) begin
- if (!iRST_N)
- cnt <= 4'h0;
- else
- cnt <= cnt + 4'h1;
- end
- endmodule
7行
wire [3:0] Cnt;
假设我想用SignalTap II去观察Cnt这个wire。
Cnt都是0,显然不合理,表示SignalTap II无法capture cnt这个wire的值。为什么会这样呢?
因为Cnt这个wire已经被Quartus II优化不见了!!
不过有时为了debug方便,我们就是想观察这种wire,有办法让Quartus II暂时不要启动最佳化吗?
SignalTapII_wire_keep.v / Verilog
- module SignalTapII_wire_keep (
- input iCLK,
- input iRST_N,
- output [3:0] oCNT
- );
- wire [3:0] Cnt /*synthesis keep*/;
- reg [3:0] cnt;
- assign Cnt = cnt;
- assign oCNT = Cnt;
- always@(posedge iCLK, negedge iRST_N) begin
- if (!iRST_N)
- cnt <= 4'h0;
- else
- cnt <= cnt + 4'h1;
- end
- endmodule
本文关键字:暂无联系方式电脑-单片机-自动控制,电子学习 - 基础知识 - 电脑-单片机-自动控制