原创 综合中应用task

2011-6-29 16:36 2170 3 5 分类: FPGA/CPLD

综合中应用task

在这之前,我一直以为task是不可以综合的,因为自己多是在testbench中使用,而且自己在任务中多使用的是不可以综合的语句,那么采用可综合语句到底可不可以综合了,有何影响了,下面通过一个例子来分析一下。

  先看一个实例:

      module  test_02 (clk,rst_n,dout);

 

       //input & output list

       input clk,rst_n;

       output  [7:0]  dout;

      

       reg  [7:0]dout;

       reg  [1:0]cnt;

       always @ (posedge clk)

              if(!rst_n)   cnt <= 2'd0;

              else     cnt <= cnt + 1'b1;

 

       always @ (posedge clk)

          begin

                     case(cnt)

                            2'd0 :  dout <= 8'h10;

                            2'd1 :  dout <= 8'h01;

                            2'd2 :  dout <= 8'h5a;

                            2'd3 :  dout <= 8'ha5;

                       default : dout <= 8'h10;

                     endcase

              end

       endmodule

  综合后的RTL图如下:

20110629162939001.jpg

Testbench如下:

`timescale  1ns/1ps

module  testbench( ); //测试平台通常没有输入/输出端口

//---输入端口定义为reg和输出端口定义为wire------------------

reg   clk,rst_n;

       wire  [7:0]dout;

       wire  [1:0]cnt;

       //---50M波形----------------------------------------

       initial

              begin

                     clk= 1'b0;

                     forever

                     #10 clk= ~clk;

              end

       //---实例引用被测试模块----------------------------------------------

       test_02  test_02_0(

                                          .clk(clk),

                                          .rst_n(rst_n),

                                          .cnt(cnt),

                                          .dout(dout)

                                   );

       //--监视输出并与期望值做比较--------------------------------------

  initial

              $monitor("at time is %t and cnt is %d,dout is %d",$time,cnt,dout);

             

       initial

              begin

                     rst_n = 1'b0;

                     #100;

                     rst_n = 1'b1;

                     $display("start simulation right now!");

                     #100_0000;

              end

       endmodule

采用modelsim 6.6d的仿真结果如下图:

20110629162941002.jpg

如下图所示:基本功能是已经实现!也就是一个计数译码的功能。

采用Task来写,则可以采用以下方式:

module  test_task01 (clk,rst_n,dout,cnt);

 

       //input & output list

       input clk,rst_n;

       output  [7:0]  dout;

       output  [1:0] cnt;

      

       reg  [7:0]dout;

       reg  [1:0]cnt;

       always @ (posedge clk)

              if(!rst_n)   cnt <= 2'd0;

              else     cnt <= cnt + 1'b1;

 

       always @ (posedge clk)

                     begin

                        code(cnt,dout);

                     end

                    

       //任务的定义

       task code;

              input   [1:0]code_in;   //输入代码

              output [7:0]dout;

              begin

                     case(code_in)

                            2'd0 :  dout <= 8'h10;

                            2'd1 :  dout <= 8'h01;

                            2'd2 :  dout <= 8'h5a;

                            2'd3 :  dout <= 8'ha5;

                       default : dout <= 8'h10;

                     endcase

              end

       endtask

       endmodule

综合后的RTL图如下:

20110629162943003.jpg

Modelsim的仿真图如下:测试testbenchtest_02testbench相同。

20110629163500001.jpg  

 

 

从综合结果来看,二者的综合后的结构是一样的,在功能上也差不多。

如果task能被综合,task只能是采用组合逻辑的语句来实现的,才可以被综合。因为在综合的时候就可以将该组合逻辑部分复制到主程序中去!

 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户377235 2013-8-20 13:03

你用的是并行方式 比较简单 你有HDM32GS12-B它的管脚图资料吗??

用户1396350 2011-7-19 10:59

其实当初我也有迷惑,后来试了试,发现可以综合的

用户394057 2011-7-4 23:46

这个应用不错 也是很多人迷惑的 多谢!

用户85913 2008-3-26 18:06

你用实物弄过吗?? 可不可以设置列位置??

用户21428 2008-3-23 15:38

谢谢你的资料 我也苦于这种SED1520控制器的LCD不能设置列地址 无论怎么弄都不行,看来是proteus本身的问题了吧
相关推荐阅读
用户1396350 2011-07-28 11:44
SDRAM控制器调试总结
SDRAM调试总结SDRAM调试做了很久,也想了很多方法。采用的是特权同学的代码,经过仿真测试,上板调试的时候,串口上总是没有数据,一直为FF。后来在synplify中修改了时钟之间的延时,改为18n...
用户1396350 2011-06-08 15:45
如何利用quicktext快速进行verilog的编写
notapad是一个比较好的文本编辑器,在使用过程中发现其无法创建文件模板,每次写代码的时候,总要复制粘贴,给代码加上文档的说明等信息,便于自己以后的管理和维护。我使用的quicktext0.2.2,...
用户1396350 2011-05-09 16:07
仿真isp的fifo时出错的解决方法
在仿真ISP的fifo时,modelsim会出现下面的错误:#** Error: (vsim-3043) C:/ispTOOLS8_1/cae_library/simulation/verilog/x...
用户1396350 2011-05-08 15:08
如何解决ispLEVE安装错误ispsys.ini is not match your system
写这边文章的目的在于,帮助大家分析一下,为什么会出现这个问题,如何解决。毕竟Lattice的官网也没有给出详细的分析和解决方法                     这个问题是我在安装lattice...
用户1396350 2011-05-08 15:03
testbench学习笔记(二)--仿真isp的ip核
attachment downloadattachment downloadattachment downloadattachment download采用ispleverstarter 8.0,和m...
我要评论
2
3
关闭 站长推荐上一条 /3 下一条