【Day11】Function & Task

很多人对於 Function 以及 Task 有点混乱,这篇将带你搞懂他们~

共有的特色

  • 他们都会写在 Module 内而不是外面。
  • 都不能使用 wire 变数(原因大概也是 wire 不具有记忆性吧)。
  • 被使用时都会放在 always 内(所以适用 Behavioral level)。
  • 里面都不能放 always block。

Function

  • 可以引用其他的 Function,但就是不能引用 task。
  • 至少要有一个以上的 input。
  • 最多只能有一个 Output。
  • 一定出现在等号右边(有 output 值)。

EX:
输入数字计算需要的位宽大小

function integer log2;
  input integer in ;
  for(log2=0; in>1; log2=log2+1) begin
    in = in >> 1 ;
  end
endfunction

引用 log2:

parameter width = 16;
reg [log2(width)]:0]a;//5 bit register a

在这边值得注意的是,上面虽然用了 integer,你可能会想,这样不是很耗硬体资源吗,不如自己算好 log2 再打上数字还比较省资源,但其实那些数字会在 "前置处理器" 就先帮你算出来了,所以并不会合成出实际的电路~
(在 quartus 编译好然後查看 RTL Viewer 就可以知道了~)


Task

  • 可以引用其他的 Function 以及 task。
  • 不一定要宣告 input、output,有的话可以有数个都没问题。

EX:
七段显示解码(共阴)

task give_seg;
  input reg [13:0]in;
  output reg [7:0]out;
  casex(in)
    14'd0:out = 8'b11111100;
    14'd1:out = 8'b01100000;
    14'd2:out = 8'b11011010;
    14'd3:out = 8'b11110010;
    14'd4:out = 8'b01100110;
    14'd5:out = 8'b10110110;
    14'd6:out = 8'b10111110;
    14'd7:out = 8'b11100000;
    14'd8:out = 8'b11111110;
    14'd9:out = 8'b11100110;
    default:out = 8'b00000010;
  endcase
endtask

<<:  【Day15】[资料结构]-二元搜寻树Binary Search Tree, BST

>>:  [Day26]Jolly Jumpers

[Day25] 程序码重构

接下来要回去弄日K交易策略,先把网格交易机器人打包起来独立成一个档案,还有把登入的部分打包起来,未来...

Swift 新手-语法基础

零基础学习 Swift,建议可以先阅读官方编排的教学架构,获取基础观念、认知 Swift 官方社群 ...

Day 19 - 在SQL server 建立Table以及设计资料表

昨天我们讲到如何在SQL server建立DB,但像是Table、Column之类的该如何建置呢,很...

D10 - 点一笼热呼呼的小笼闭包 Closure

前言 闭包,一个完全无法从字面意思了解的专有名词,若是改叫小笼闭包,是不是马上联想到这个画面 一个个...

[DAY 19] _ARM-M0-内核外设SysTick-写个精准的Delay

SysTick是内核系统的定时器,先来看看SysTick来源在哪,下图stm32f030cc的时钟树...