chisel是在scala的基础上建立起来的,初学chisel可能有点摸不着头脑,建议去菜鸟学学scala先。码一下scala的笔记,贼适合入门。
Scala是一个面向对象的编程语言,了解这一点很重要,这也是Scala和Chisel的一个很大的优势。
- 变量是对象。
- 运用
val
声明的常量也是对象。 - 甚至literal也是对象(例如,1,2,3,字符串等)。
- 函数本身也是对象。这之后会详细说明。
- 对象(Object)是类(class)的实例。
- 事实上,面向对象中的对象(object) 在Scala中被称为实例。
- 在定义一个类的时候,需要指定:
- 类中的数据(
val
,var
) - 类的操作,称为方法(method)或者函数(function)。这些方法可以通过该类的实例来调用。
- 类中的数据(
- 类可以从其他类继承。
- 被继承的类叫做父类,继承的类叫做子类。
- 在这种情况下,子类继承父类的所有数据成员和方法。
- 子类也可以扩展或重载从父类继承的这些方法。
- 类也可以继承自特征(traits)。Traits可以被看作是轻量级的类,它可以允许多继承。
- (Singleton)Object对象在Scala中是一个特殊的类。
- 它们不是上面所说的对象,上面那些我们称之为实例。
下面是一个创建Scala类的例子:
// WrapCounter从0开始计数,一直到最大值然后归零
class WrapCounter(counterBits: Int) {
val max: Long = (1 << counterBits) - 1
var counter = 0L
def inc(): Long = {
counter = counter + 1
if (counter > max) {
counter = 0
}
counter
}
println(s"counter created with max value $max")
}
在上面的代码中:
class WrapCounter
--这是类WrapCounter的定义.(counterBits: Int)
-- 创建一个WrapCounter实例需要一个整数类型的参数,名称为counterBits
。- 大括号 ({}) 里面是这个类的代码块。大部分的类在这里面定义变量,常量和方法。
val max: Long =
-- 这个类包含一个叫max的成员常量, 类型是Long
,并且在创建类的实例时被初始化。(1 << counterBits) - 1
计算counterBits这么多比特所能表示的最大值。max在这里由val
创建,所以它是常量,之后不能被改变。- 变量 counter 在这里被创建出来,并且赋初值为 0L , “L” 在这里表示0是一个长整型,所以编译器也会推定 counter 为长整型。
- max 和 counter通常被称为该类的 成员变量(或常量)。
- 该类定义了一个叫inc的方法,该方法不需要参数并且返回一个长整型 Long 的值。
- 方法 inc 包含如下代码:
counter = counter + 1
递增 counter.if (counter > max) { counter = 0 }
检查counter是否大于最大值max,如果大于的话,重置成0。counter
-- 最后这一行很重要- 一个代码块的最后一行被认为是该代码块的返回值,调用者可以使用或忽略该返回值。
- 这是一个通用的办法;例如,在
if
和else
语句中,真假分支都可以是代码块,所以if...else
语句也可以返回值:例如val result = if (10 * 10 > 90) 'greater' else 'lesser'
的返回值就是'greater'。
- 所以在这里,方法inc的返回值就是counter。
println(s'counter created with max value $max')
在标准输出stdout中打印出一个字符串。由于println直接位于定义类的代码块中,所以它会在每一次创建该类的实例时都会被运行。- 这里打印的字符串是一个被解析(interpolated)的 字符串。
- 在引号前面的 s 表示这是一个被解析的字符串。
- 被解析的字符串会在运行的时候才被处理。
- 字符串中的 $max 会被变量max的值所替换。
- 如果$ 后面跟的是任意Scala代码块的话,这个代码块可以包含任何Scala语句。
- 例如,
println(s'doubled max is ${max + max}')
. - 这个代码块的返回值将会替换掉字符串中的
${...}
。 - 如果返回值不是字符串,则会被转换为1;理论上scala中几乎每个类型都可以隐式地转换为字符串)。
- 例如,
- 除非您正在调试,否则应该避免类似这样每次创建类的实例时都要打印的内容,以避免标准输出显示了太多东西。