ModelSim中自带一个例子的疑问

2019-03-25 10:04发布

在ModelSim安装成功后应该是在.....ModelSimexamples utorialsverilogasicSimulation的目录下,有一个counter.v和tcounter.v的两个文件, 主要的疑问就是在count.v中为什么要加入function那一块?老是无法明了。 疑问的部分就是大号粗体的那部分,程序如下: // Copyright 1991-2009 Mentor Graphics Corporation
//
// All Rights Reserved.
//
// THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS THE PROPERTY OF
// MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS.
//   module counter (count, clk, reset);
output [7:0] count;
input clk, reset; reg [7:0] count;
parameter tpd_reset_to_count = 3;
parameter tpd_clk_to_count   = 2; function [7:0] increment;
input [7:0] val;
reg [3:0] i;
reg carry;
  begin
    increment = val;
    carry = 1'b1;
    /*
     * Exit this loop when carry == zero, OR all bits processed
     */
    for (i = 4'b0; ((carry == 4'b1) && (i <= 7));  i = i+ 4'b1)
       begin
         increment = val ^ carry;
         carry = val & carry;
       end
  end      
endfunction
always @ (posedge clk or posedge reset)
  if (reset)
     count = #tpd_reset_to_count 8'h00;
  else
     count <= #tpd_clk_to_count increment(count); /*****************************************************************
Use the following block to make the design synthesizable. always @ (posedge clk or posedge reset)
  if (reset)
     count = 8'h00;
  else
     count <= count + 8'h01;
******************************************************************/
endmodule
[ 本帖最后由 似水如烟 于 2011-9-5 23:33 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
似水如烟
1楼-- · 2019-03-25 17:58
< /

忘记把程序贴上了,疑问的部分就是大号的字体那部分。

// Copyright 1991-2009 Mentor Graphics Corporation
//
// All Rights Reserved.
//
// THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS THE PROPERTY OF
// MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS.
//  

module counter (count, clk, reset);
output [7:0] count;
input clk, reset;

reg [7:0] count;
parameter tpd_reset_to_count = 3;
parameter tpd_clk_to_count   = 2;

function [7:0] increment;
input [7:0] val;
reg [3:0] i;
reg carry;
  begin
    increment = val;
    carry = 1'b1;
    /*
     * Exit this loop when carry == zero, OR all bits processed
     */
    for (i = 4'b0; ((carry == 4'b1) && (i <= 7));  i = i+ 4'b1)
       begin
         increment = val ^ carry;
         carry = val & carry;
       end
  end      
endfunction

always @ (posedge clk or posedge reset)
  if (reset)
     count = #tpd_reset_to_count 8'h00;
  else
     count <= #tpd_clk_to_count increment(count);

/*****************************************************************
Use the following block to make the design synthesizable.

always @ (posedge clk or posedge reset)
  if (reset)
     count = 8'h00;
  else
     count <= count + 8'h01;
******************************************************************/
endmodule

tx_xy
2楼-- · 2019-03-25 18:36
这个 increment 是定义的一个 function 。
在 下一个always 语句块中 有调用这个function 。。。
用软件的思维来说 你可以简单理解为一个子函数 哈哈 。。。
从硬件的角度来说 你可以简单理解为一个硬件电路模块 。。。
eeleader
3楼-- · 2019-03-25 19:14
 精彩回答 2  元偷偷看……
似水如烟
4楼-- · 2019-03-25 20:11
版主说的很对。这个函数是不是主要是用来实现计数+1和进位的?我自己的理解
tx_xy
5楼-- · 2019-03-25 23:24
function [7:0] increment; input [7:0] val; reg [3:0] i; reg carry; begin increment = val; carry = 1'b1; /* * Exit this loop when carry == zero, OR all bits processed */ for (i = 4'b0; ((carry == 4'b1) && (i <= 7)); i = i+ 4'b1) begin increment = val ^ carry; carry = val & carry; end end endfunction 哈 看了下代码 提三个建议 1. reg carry;carry应该是1bit的信号吧;在for循环中,有这样的语句:(carry == 4'b1),一个1bit的信号与4bit的信号进行比较,综合的时候肯定会出warning啦;建议修改:) 2. 同样在for循环语句中,有(i <= 7)这个判断条件,从代码优化的角度,建议楼主修改为 i<8,黑黑。。。
3. for循环语句中i = 4'b0,明显写错了,HOHO。

[ 本帖最后由 tx_xy 于 2011-9-6 23:50 编辑 ]
tx_xy
6楼-- · 2019-03-26 04:49
另外,您的这个函数要实现什么功能,俺也不知道

哈,自己仿真啦,别人告诉你的都是假滴。。。

一周热门 更多>