acm-header
登录

ACM通信

实践

硬件系统设计中的抽象


硬件系统设计中的抽象

信贷:戴夫•博林格

回到顶部

软件工程的历史是抽象机制不断发展的历史,旨在解决日益增加的复杂性。然而,硬件设计并不像现在这样流行。例如,两种最常用的硬件描述语言Verilog和VHDL912可以追溯到20世纪80年代。在结构抽象(如类型、封装和参数化)方面,标准的更新落后于现代编程语言。他们的行为语义甚至更落后。它们是根据在单处理器von Neumann机器上运行的事件驱动模拟器指定的(甚至对于它们最近的后代SystemVerilog和SystemC也是如此)1011).

这些hdl都有“可合成的子集”,这些子集限制了它们,以缩小这种行为差距,但这种不匹配从未完全消除。随着硬件芯片容量根据摩尔定律呈指数级增长,这种压力开始显现出来,我们被要求设计具有惊人多样性和复杂性的整个芯片系统(soc)。

另一个重要的问题是,到目前为止验证(测试)是使用模拟完成的,但这越来越不实用。3.在现代的soc中,硬件既大又复杂,它运行着功能齐全的操作系统和应用程序等沉重的软件负载。验证包括将所有这些模拟在一起,软件模拟运行数天或数周并不罕见。模拟速度通常引用在10s到1000s的KHz,而需要的是MHz速度。

这个问题唯一可行的解决方案就是人们所说的硬件模拟,模拟现场可编程门阵列(fpga)的硬件设计。然而,这种基于fpga的仿真不能留给设计的最终草案;它必须从设计过程的最开始,从早期模型开始。这样做对hdl的行为语义提出了进一步的要求。

然而,简单的模拟是不够的。以前,对于只在软件模拟中运行的模型和测试台使用单独的高级语言可能是可以接受的,例如SystemC TLM(事务级建模)19和SystemVerilog VMM(验证方法手册)。2然而,今天所需要的是一种HDL,它可以用于所有这些目的,从早期模型和测试台到详细的实现,在那里这些不同的组件可以自由混合所有这些组件可以合成用于FPGA仿真。因此,HDL需要是通用的,一方面它适合各种数字设计(例如,不仅仅是信号处理),另一方面它应该是完全可合成的,无论是用于模型、测试工作台还是实现。

这些要求意味着对hdl的彻底重新考虑。本文介绍了Bluespec SystemVerilog (BSV),18它的设计正是出于这样的考虑,同时尽可能重用SystemVerilog的特性。BSV的结构扩展(包括更有表现力的类型、重载、封装和参数化)受到Haskell的启发,20.函数式编程语言。它的行为语义受到术语重写系统的启发13(或protected Atomic Actions),它最适合描述复杂的并发硬件。这不仅仅是一个理论练习,ebsv和它的工具已经在工业上使用了五年多(你的智能手机或平板电脑很可能包含用BSV设计的组件)。

回到顶部

为什么不使用现有的软件语言进行硬件设计?

在研究BSV之前,考虑一门新语言是否有必要是有用的。虽然从功能的角度来看“一切都只是计算”,但硬件系统设计具有与软件设计截然不同的特点。

并发/并行性。硬件系统通常具有大规模、细粒度、异构和反应性的并行性。(与一些作者不同的是,我不区分这些术语并发性而且并行性).这种并行性可以提高速度,这通常是在硬件中实现某些东西的主要原因。巨大的在这方面,意味着并行活动的数量可能达到数千甚至数百万。精密意味着并行活动在可能非常小的共享资源(例如几个比特的单个寄存器)上频繁交互(以时钟周期的时间尺度衡量)。异构意味着并行活动涉及不同的任务,例如SIMD(单指令,多数据)或SPMD(单进程,多数据)计算。最后,响应式意味着并行活动通常由异步事件触发,例如不可预知的数据到达、中断、仲裁解决和I/O。

不幸的是,大多数软件语言根本不是并行的,而是完全顺序的。一些大规模并行的扩展只处理SIMD并行。线程扩展可以处理异构性,但对于大规模、细粒度或反应性并行来说,它们是出了名的困难。11522

体系结构和算法。在硬件系统设计中,好的体系结构(及其附带的成本模型)是一个中心设计目标和设计活动的结果,而软件大多是为一个固定的、给定的输入体系结构(典型的von Neumann,可能带有扩展,如SIMD)设计的图1.因此,在硬件设计中,算法和架构是不可分割的,抽象地谈论“纯算法设计”是没有意义的,没有一些架构模型给出具体的成本度量。

由于它们都是图灵完备的,任何体系结构都可以用现有的编程语言建模或模拟,但这存在两个基本问题。首先,精确地为复杂的体系结构建模需要非常严格的纪律(因此需要大量的时间和精力)。其次,对体系结构建模通常意味着在执行速度上损失数量级,这一方面是因为额外的解释层,另一方面是因为所建模的体系结构的自然并行性基本上被完全抛弃了。3.领域特定语言(dsl)可以解决第一个问题,但不能解决第二个问题。对于大多数软件编程语言,“原生”体系结构模型是冯·诺依曼模型(一个顺序进程,对一个大的、扁平的内存有恒定的时间访问),只有原生冯·诺依曼算法才能快速执行。

这个词建筑的透明度表达源程序直接反映所需的体系结构的想法。抽象机制可以隐藏细节,但不应该扭曲结果体系结构。这个属性对于程序员/设计师来说是很重要的,只要它不影响可预测性和可控制性。此属性对于编译器(合成)产生有效的实现也是必不可少的。

回到顶部

软件仿真的不足

如前所述,今天的SoC需要基于fpga的仿真来实现可接受的仿真速度,这需要HDL(模型、测试台和SoC组件全域的实现)的通用适用性和通用合成器。不幸的是,没有一种软件语言适合于此。

许多业内人士主张使用c++和systemc的组合——前者用于描述单个知识产权(IP)块的算法内容,后者用于描述系统级通信、层次结构,以及将这些IP块集成到SoC中。IP块中的c++可以进行所谓的高级合成5(HLS),使用工具从连续的c++自动生成并行硬件,给定声明性目标,如延迟、吞吐量、面积、功率和目标硅技术。详细的评论需要另一篇文章,但本节和Stephen A. Edwards关于该主题的文章7提供一些背景知识。

回到顶部

Bluespec SystemVerilog

让我们首先关注BSV的计算模型(即它的行为语义),因为这是现有软件语言对硬件设计的最大限制。然后我们给出一个例子来演示现代结构抽象机制的使用。

规则:基本计算模型。Verilog和VHDL的起源是模拟语言,它们建立在单处理器von Neumann模型之上:顺序进程、基于堆栈的过程调用、传统的基于堆栈的可更新变量和协作多任务处理。另一方面,BSV产生于直接的硬件描述状态和并行状态转换。计算机科学文献中有一个计算模型非常适合这一点,它被称为术语重写系统,13保护原子操作,或重写规则。它在许多用于复杂并发系统的正式规范语言中被使用,包括Dijkstra's protected Commands,6Chandy和Misra的UNITY,4Lamport TLA +,14阿比尔的事件b,16和许多更多。下面的BSV摘录演示了按升序对四个整数排序的计算。

ins01.gif

前几行实例化四个命名的寄存器(存储元素)x1……x4,包含类型的值int.的mkRegU右边是构造函数,它的细节在这里并不重要。

规则(或保守原子行动)swap12就像一个反应过程(也就是说,每当它的布尔条件x1 > x2是真的)。规则的主体是行动And在语义上是an瞬时事件。在这里,它由两个较小的action组成:一个为中赋值x1x2,反之亦然。最终的结果是交换两个寄存器中的值。规则swap23而且swap34是相似的。

规则之间没有固有的顺序,只要条件为真,规则就可以触发。因此,在本例中,可能会发生这种情况swap12而且swap34并行执行它们的交换。但是作用于共享状态的规则呢,比如swap12而且swap23,两者都会更新x2?规则具有的语义原子事务,因此,在本例中,这两个规则只能以某种顺序触发(例如,依次)。对于本例,选择两种可能的顺序中的哪一种并不重要;无论如何,这些寄存器最终都会被排序。


随着硬件芯片容量根据摩尔定律呈指数级增长,这种压力开始显现出来,我们被要求设计具有惊人多样性和复杂性的整个芯片系统(soc)。


前面的片段似乎重复了4个相似的寄存器和3个相似的规则,但我们这样写它首先是为了解释语义。它更可能是这样写的:

ins02.gif

这扩展(在硬件语言术语中称为“静态详细说明”)到与前面相同的片段。当然,4这里可以抽象为一个参数。该片段表示具有相同O(N)的入门编程文本的经典气泡排序算法2)的最坏情况复杂性,除了这里的“冒泡”可以并行发生,模原子性(也就是说,任何一对在共享寄存器上不冲突的启用规则都可以并行触发)。

当原子性要求对两个已启用的冲突规则进行排序时,选择的顺序可以不指定。这在一开始给硬件设计者敲响了警钟,因为不确定性等同于不可预测的(坏的)结果。对于正式的规格说明通常是受欢迎的,然而,过早地坚持时间表被认为是不必要的过度规格说明。在BSV中,可以使用各种技术在必要时确定特定的调度选择。

规则对硬件意味着什么,为什么它们很重要。所有硬件设计都涉及指定更新状态的并行活动。Verilog中的经典风格(所有这些注释也适用于VHDL)是以状态为中心的。对于每个状态元素x

ins03.gif

更一般地,在每个条件分支中可以更新多个状态元素,条件可以写成情况下声明。然而,在可合成代码中,每个状态元素只能在一个中更新总是块,并且在每个条件分支中最多只能更新一次。

这就是如何在(可合成的)Verilog中并行更新共享资源的问题:它只在一个“进程”中更新(总是Block),对于每个时钟,完全正确一个可能的新价值x都是确定的。它几乎是所生成硬件的直接、显式规范:条件表示多路复用器的输入x注册;所述条件指定如何选择多路复用器输入中的一个并将其输入到寄存器中;这些条件还可以指定是否更新寄存器。所有这些逻辑统称为控制逻辑

不幸的是,这种以状态来组织行为的方式与行为的典型概念化方式是正交的:作为步骤的集合,或者交易.行为的每一步都可能涉及到对多个状态元素的更新(可能是有条件的)。这种从以事务为中心的维度到以状态为中心的维度的“转置”是Verilog问题的核心。以状态为中心的观点不能很好地扩展并行活动的数量,并且在活动如何竞争共享状态方面变得更加复杂。考虑下面的问题图2,它演示了两个寄存器x而且y在一定条件下由三个并行过程更新。的更新,假设进程0的优先级低于进程1x的更新,进程1的优先级低于进程2y, Verilog解决方案可能是这样的:

ins04.gif

Verilog代码可以用多种风格编写,但都是以状态为中心的。从问题语句到以状态为中心的代码的“转置”已经纠缠和模糊了原始事务。同样,优先级被连接到代码结构中,进程2相对于进程1的优先级用的顺序表示如果……其他的.进程1相对于进程0的优先级表示在cond1 !术语。事实上,聪明的设计师可能会意识到这一点cond2是真的,进程1不能更新x,从而为进程0提供了这样做的机会。因此,设计师可能会“改进”最后两行:

ins05.gif

注意控制的传递性:进程0的更新x受非相邻进程2条件的影响。第三,一些过程条件在多个条款中重复,通常存在重复错误的风险。

想象一下,对规范的更改(这在现实世界中经常发生)要求在三个流程中有不同的优先级。或者想象用新的控制条件添加另一个进程,或者可能添加另一个共享状态变量,或者两者都添加。整个法典都需要修订;很难进行局部的增量更改。

即使如此小的示例也包含如此微妙的控制逻辑,这一事实应该使读者敏感地认识到这样一个事实:在扩展到更多并行活动和共享状态元素以及扩展更新条件的复杂性时,以每个时钟为基础的以状态为中心的方式推理并行更新可能非常棘手。

本例的BSV代码如下所示:

ins06.gif

规则是流程描述的直接表达(即,它们以事务为中心,而不是以状态为中心),最后一行表示调度优先级。从该代码合成的结果基本上与前面展示的Verilog代码相同,即管理共享状态的并行更新所必需的复杂控制逻辑。添加更多进程、更多共享状态或更复杂的更新条件很容易。

当扩展到组织成模块的系统时,规则就更重要了;在描述模块化机制之后,我们将回到这个讨论。

将规则组织到模块中。在面向对象的编程中,复杂的系统被组织成对象。关键的行为构念是a过程线程(只是顺序语言中的一个)。进程植根于某些模块(可能是“main”),但它可以通过方法调用跨越对象边界。因为方法本身可能调用方法,因此进程可以访问无限数量的对象。每个方法在语义上都是过程的一个片段。

类似地,在BSV中是语法规则在一个模块中可以调用另一个模块中的方法。方法又可以调用其他方法。每个方法在语义上都是规则的一个片段。因此,方法不仅仅是一个过程,它还是一个有保护的表达式。语义规则由句法组成规则构造和(传递地)它调用的所有方法;这个语义规则是并行性和原子性的单位。

一个实现了包含整数的FIFO的小模块说明了这一点。首先它的接口声明:

ins07.gif

与c++虚拟类一样,它仅仅描述模块的外部可见方法。的询问方法对项进行排队x.它的行动类型表示它不返回值,只是起作用。的第一个方法不接受参数,并返回队列头部元素的值。的描述:方法是纯粹的行动它没有论点或结果;它只具有丢弃队列中的第一个元素的效果。

图3说明实现此接口的一个可能模块的代码。这是一个模块构造函数,可以实例化多次来创建实际的模块(因此在风格上选择在模块名中mkFIFOint,暗示这个词使).FIFOint在头中指定接口。接下来的两行实例化了两个寄存器:数据,包含一个整数,初始未指定;而且最初包含一个布尔值真正的.的询问方法由条件保护如果(空的)只有当守卫为true时,调用它的任何规则才会被启用。当调用时,它存储它的参数x在数据寄存器和集合中.的第一个而且描述:方法由条件保护如果(!空的)只有当该保护为true时,调用它们的任何规则才会被启用。的第一个方法返回数据的值,并且不改变FIFO。的描述:方法有设置的效果真正的

这个例子很简单,但是它可以推广到N-元素FIFO扩展数据到寄存器的向量,并维护通常的头和尾指针。FIFO的内容类型也可以是泛型(多态),而不仅仅是包含int值。

许多模块都有类似于fifo的接口,即接受或产生值的流量控制端口。我们可以为此定义多态接口:

ins08.gif

除了语法细节之外,这些功能类似于面向对象语言中的功能。关键的区别在于,OO方法是顺序过程的片段,而BSV方法是规则的片段,并且有保护。

一个更大的例子。图4图示蝶形交叉开关,它是一种具有N个输入端口和N个输出端口的硬件设备(这里,N=4)。数据包从输入端口进入,每个数据包被路由到输出端口。注意,该开关具有递归结构:所示的4x4开关包含两个2x2开关作为组件,每个开关依次包含两个1x1开关(缓冲区)。其中两个4x4开关可以用来制作一个8x8开关,以此类推。还要注意,有三个基本组件:fifo(1进1出)、归并框(2进1出)和路由逻辑(1进2出)。图5显示接口类型声明。

它在类型上是泛型的或多态的包_ t通过交换机的报文数量。它是嵌套的,或分层的,因为它是根据两个子接口定义的:输入_港口而且_输出端口.反过来,它们使用标准列表的集合要引用的数据结构FIFOin而且FIFOout接口。图6显示了一个模块mkXBar实现了这个接口。

P1P3参数:n请求一个n x n开关;destinationOf是来自包的函数(类型t)到(类型的)目的地使用UInt # (32),无符号32b整数),可用于进行路由决策;而且mkMerge2x1是2输入1输出合并模块的构造函数。在语义上,模块构造函数只是从参数到模块的函数。此外,它是一个高阶函数,也就是说,它的参数本身可能是函数和模块构造函数。这些特性在诸如Haskell这样的高级编程语言中是标准的20.和标准毫升(SML)17但在HDLs中非常罕见,特别是在可合成的HDLs中。

模块的大部分是模块的递归定义。的然后大条件的一部分是基本情况(n = = 1).使用实现1x1开关mkFIFO.下一行使用函数toFIFOin而且toFIFOout(简单;没有显示)来分离先进先出界面FIFOin而且FIFOout接口,并将它们构建为单例列表iports而且oports

其他的部分是递归的情况(n > 1).代码首先递归实例化mkXBar两次,大小为n/2,用于上下2x2子开关。它附加输入_港口而且_输出端口并将它们保存在列表中iports而且midports,分别。然后实例化位于开关右边缘的n个2x1合并块的垂直列图4使用库高阶函数replicateM在参数mkMerge2x1.它使用标准库列表处理高阶函数地图的oport _函数(没有显示;的输出端口mkMerge2x1模块)来创建oports列表。

循环生成规则的n个实例。在任何一个实例中,名称x指的是位于j头部的包th港口midports.这个函数computeRoute(没有显示;一个简单的数值计算)应用于获得合并模块的索引,x应该转发到其中,这是在小条件中完成的。该规则还会解除数据包的队列。

每个表达开关行为的规则都隐藏了很多控制细节:

  • 只有当数据包在该规则的上游FIFO上可用时,该规则才会启用第一个而且描述:方法)。
  • 只有当一个数据包可以被发送到它的下游合并块中时,该规则才会被启用询问).例如,它可能因为流量控制而被阻塞。
  • 最后一个控制条件由于下游合并块是动态选择的这一事实而进一步细化,这取决于数据包,因此,只有所选块的查询保护是重要的。

一个更微妙的控制条件产生于两个规则之间的冲突。在循环,对规则排队进入相同的合并块。这个争用可能需要其中一个竞争规则被暂停(即不启用)以满足原子性。

为什么规则很重要(续)。在Verilog中,上述所有控制注意事项都表现为合并模块的物理输入和输出端口上的显式、可见的控制线,以及关于如何使用这些线的协议。这些都是由设计者明确指定的,并且需要在每个模块的基础上进行努力。它们是特别的,因为这些控制接口和协议因模块而异,因设计器而异,甚至因同一设计器而异。协议(语义)通常在附带的文本和时序图中进行传达,并且正如您所想象的,它通常是不完整的、模糊的,有时是错误的。在使用规则时,编译器会自然、自动和正式地处理这种控制复杂性。

这种自动化在适应更改(修复错误、对更改的规范做出反应等等)方面尤其重要。的mkMerge2x1模块是一个正式的参数,一个黑盒子。一个实际参数可能同时允许这两种情况询问端口将同时激活,而另一个可能不会,这可能是因为一个端口具有单独的内部缓冲区,而另一个端口共享内部缓冲区。这影响竞争规则是否在mkXBar可以同时发射或不发射(这是控制传递性的另一个例子)。使用临时控制逻辑(如在寄存器传输级,或RTL中),它可能无法在不重新设计的情况下适应这种更改mkXBar,而对于规则,编译器处理它。


规则是用于硬件描述的良好DSL的一部分,因为它们就像状态机转换一样,对于硬件工程师来说熟悉且直观。然而,规则更加强大,因为它们是并行的和原子的。


考虑这个类比:在编译软件时,想象手工分配寄存器,为编写的每个函数设计和记录一个特别的调用约定。即使只做一次也是相当困难和痛苦的,但是如果源代码发生更改,情况会更糟,因为寄存器分配具有跨函数边界的传递效果,例如跨硬件模块边界的控制逻辑。仅仅向函数添加一个参数可能就需要为调用方和被调用方重新分配寄存器,这可能会在多个函数之间产生连锁反应。幸运的是,编译器将这一过程自动化,对程序员来说,向函数添加参数非常简单。类似地,规则简化了源代码的编写和修改;编译器(合成)计算出控制逻辑中所需的更改。

规则是用于硬件描述的良好DSL的一部分,因为它们就像状态机转换一样,对于硬件工程师来说熟悉且直观。然而,规则更加强大,因为它们是并行的和原子的。

回到顶部

合成到硬件

历史上,编程和规范语言中的规则只关注功能而不是性能;只有一种抽象的时间概念,即一条规则可能先于另一条规则生效。在硬件设计中,性能通常是核心需求,而不仅仅是实现细节;因此,计算模型必须让设计人员看到这一点。

由于篇幅限制,这里不允许进行详细描述,但BSV确实定义了这种将规则映射到时钟硬件的具体映射。时钟和重置是抽象数据类型,规则和方法被映射到时钟和重置域。强静态类型检查验证这些域的隔离性。总之,BSV具有易于使用和语义严格的功能,可用于健壮地创建具有多个时钟域的设计。

今天另一个非常重要的考虑因素是电力消耗。在细粒度上,BSV时钟可以门控,门控条件有机地集成到规则条件中。在较粗粒度的IP块上,BSV具有电源管理设施,以一种有纪律的方式关闭或缩放电源和时钟到整个模块或子系统。

一个有趣的想法是,BSV也可以编译成异步逻辑(这在电路定时和功耗方面有许多潜在的优势),但如何做到这一点,以及如何推理这种体制下的系统性能,仍然是有待研究的问题。

asic的合成质量。将Rules编译成高效硬件的技术最早是在十多年前开发出来的。8从那时起,它一直在不断改进,并被用于数百个设计。在一些应用程序中,存在一个现有的RTL设计,用于苹果与苹果之间的比较,一般来说,质量具有可比性(以硅面积和性能衡量),通常在5%以内。

在少数情况下,bsv生成的RTL的质量明显优于手工编码的RTL(15% ~ 25%)。这在一开始是令人惊讶的,因为在软件中,您通常为更高的抽象付出性能代价。见图1但是,硬件设计中更高的抽象可以产生显著的算法优势(即更高效的体系结构)。

基于fpga的仿真合成。BSV的普遍适用性和可综合性为许多人打开了大门,从设计的最初阶段开始,就使用fpga作为他们的标准模拟引擎,并采用“通过改进设计”的方法。

Bluespec Inc.通过“吃自己的狗粮”,已经使用BSV为FPGA板创建高度参数化的通信、调试和IP库。这些构成了FPGA的一种操作系统,使用户拥有与主机通信和调试模型或设计的高级设施,而不是习惯上与原始FPGA板硬件进行痛苦的搏斗。

以前用户可能用c++编写测试生成器、分析器或模型,现在他们可以在BSV中编写它们,而不会丢失抽象,而且现在还能够合成它们,并在与设计相邻的FPGA上运行它们。

因此,考虑到具有大量FPGA容量的板现在可以以不到2000美元的价格购买(如Xilinx ML605),并具有BSV中通信、调试和库的舒适的高级抽象,设计人员现在可以将FPGA作为他们武库中的另一种计算武器,就像gpgpu(图形处理单元上的通用计算)一样。21

回到顶部

结论

从历史上看,软件和硬件设计者之间几乎是完全分离的,这在很大程度上归因于他们用来设计各自系统的语言之间广泛的文化(语义)差异。现代系统要求减少或消除这种专业化。今天所有有趣的硬件系统都必须运行复杂的软件,许多复杂的软件计算必须转移到硬件上,以满足性能和功耗目标。21

BSV是解决这个问题的一种尝试。BSV并没有试图将von Neumann机器(如c++和线程)的解决方案强行纳入硬件描述,而是从软件中汲取了非常适合硬件描述的优秀思想。它使用规则(来自Term rewrite Systems)描述行为,这些规则非常适合大规模、细粒度、异构、响应性并发(硬件!)它使用类型、重载、高阶函数、参数化,甚至Haskell中的单子来描述结构和结构抽象。这些想法已经在该领域进行了五年多的测试,并被用于成品,其中一个可能现在就在你的口袋里。

ACM队列的q戳相关文章
queue.acm.org

SoC:软件,硬件,噩梦,幸福
乔治·内维尔-尼尔,特尔·惠特尼
http://queue.acm.org/detail.cfm?id=644265

虚拟机的重生
孟德尔Rosenblum
http://queue.acm.org/detail.cfm?id=1017000

模糊硬件和软件之间的界限
胡马云Shahri
http://queue.acm.org/detail.cfm?id=644267

回到顶部

参考文献

1.数据竞赛是邪恶的,没有例外。Commun。ACM 53(2010年11月),84。

2.伯格龙,J.,塞尔尼,E.,亨特,A.和南丁格尔,A.。SystemVerilog验证方法手册.施普林格,2006年。

3.Burger D., Emer J., Hoe J. C., Chiou D., Sendag R., Yi J.建筑模拟的未来。IEEE微(2010年5月/ 6月),818年。

4.钱迪,k,米斯拉,J。并行程序设计:基础.Addison Wesley, Reading, MA, 1988。

5.库西,P.和A.莫拉维茨,编。高级综合:从算法到数字电路.施普林格,2008年。

6.保护命令,程序的不确定性和形式化派生。Commun。ACM 18, 8(1975年8月),453457。

7.从c类语言合成硬件的挑战。计算机设计与测试5(2006)。

8.以操作为中心的硬件描述和综合。麻省理工学院博士论文,2000年。

9.IEEE。2002.IEEE标准VHDL语言参考手册。IEEE标准1076 - 1993。

10.IEEE。2005.IEEE系统验证标准统一硬件设计、规范和验证语言。IEEE标准1800 - 2005。

11.IEEE。2005.IEEE标准系统c语言参考手册。IEEE标准1666 - 2005。

12.IEEE。2005.标准Verilog硬件描述语言。IEEE标准1364 - 2005。

13.氯化苦、J。项重写系统,卷2。牛津大学出版社,1992,1116。

14.Lamport, L。指定系统:硬件和软件工程师的TLA+语言和工具.Addison-Wesley Professional (Pearson教育),2002。

15.Lee, E. A. 2006。线程的问题。IEEE计算机39,5, 3342年。

16.梅泰尔,C。Voisin, L., 2005年5月31日。事件b语言;。http://rodin.cs.ncl.ac.uk/deliverables.htm

17.米尔纳,R,托夫特,M,哈珀,R,麦昆,D。标准ML的定义(修改后的)。麻省理工学院出版社,剑桥,麻州,1997年。

18.尼克希尔,r.s.,切克,K.R.BSV以身作则.CreateSpace 2010 (Amazon.com).

19.OSCI。2009.OSCI TLM-2.0语言参考手册;www.systemc.org

20.佩顿·琼斯(Peyton Jones)主编。Haskell 98语言和库:修订报告.剑桥大学出版社,2003年;www.haskell.org

21.辛格。S.没有处理器的计算。Commun。ACM 54, 8(2011年8月)4654。

22.威廉姆斯,r . 2010。Photoshop可扩展性:保持简单。Commun。ACM 53, 10(2010年10月),36。

回到顶部

作者

Rishiyur Nikhilnikhil@bluespec.com)在Haskell、函数式编程语言和并行编译器、数据流和多线程架构方面工作了大约20年。自2000年以来,他一直将这些想法应用到硬件设计中。

回到顶部

数据

F1图1。硬件vs.软件设计。

F2图2。由三个并行进程更新的两个寄存器。

F3图3。一个FIFO模块。

F4图4。蝴蝶纵横开关

F5图5。接口类型声明。

F6图6。crossbar交换模块。

回到顶部


©2011 acm 0001-0782/11/1000 $10.00

允许为个人或课堂使用部分或全部作品制作数字或硬拷贝,但不得为盈利或商业利益而复制或分发,且副本在首页上附有本通知和完整的引用。除ACM外,本作品的其他组件的版权必须受到尊重。允许有信用的文摘。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,都需要事先获得特定的许可和/或费用。请求发布的权限permissions@acm.org传真(212)869-0481。

数字图书馆是由计算机协会出版的。版权所有©2011 ACM, Inc.


没有发现记录

Baidu
map