ASIC-WORLD Verilog第一个Verilog代码

Posted 孤独的单刀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASIC-WORLD Verilog第一个Verilog代码相关的知识,希望对你有一定的参考价值。

写在前面

        在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的Verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。

        这是网站原文:Verilog Tutorial

介绍

        如果你去看任何有关编程语言的书籍,就会发现它们的第一个例子几乎都是“Hello World”程序。一旦你学会了这个程序,就可以说你已经对这种语言入门了。

        接下来我会先展示如何在 Verilog 语言中编写“hello world”程序,然后再介绍一个稍微复杂点的“计数器”程序。

Hello World

        下面是一个在Verilog中打印“hello world”的程序。

//-----------------------------------------------------
// 这是我的第一个Verilog程序
// 设计名: hello_world
// 文件名: hello_world.v
// 功能  : 这个程序会打印'hello world'
// 作者  : Deepak
//-----------------------------------------------------
module hello_world ;

initial begin
  $display ("Hello World by Deepak");
   #10  $finish;
end

endmodule 

        

        Verilog 的程序都以保留字 “module” 开头,后面跟上设计者自定义的模块名 。在上面的示例中,第 8 行即包含“module hello_world”。

        第 10 行包含initial块:它只在仿真开始后执行一次,即仿真时间 = 0 (0ns)时。initial块中有两条语句,它们被第 10 行的 begin 和第 13 行的 end 包围起来了。在 Verilog 中,如果一个块中有多行,则需要使用 begin 和 end。

        模块以“endmodule”保留字作为结尾,即本例的第 15 行。

        这是程序打印的结果:

Hello World By Deepak

计数器

        这是要设计的计数器的框图:

        它的预期设计规格是这样的:

  • 4 位同步递增计数器
  • 高电平有效的同步复位信号
  • 高电平有效的使能信号

        预期的计数器设计Verilog程序如下:

//-----------------------------------------------------
// 这是我的第二个Verilog程序
// 设计名: first_counter
// 文件名: first_counter.v
// 作者  : Deepak
// 功能  : 这是一个4位宽的递增计数器
//		高有效的同步复位;高有效的使能信号
//-----------------------------------------------------
module first_counter (
	clock , 	// 时钟
	reset , 	// 高有效的同步复位
	enable , 	// 高有效的使能信号
	counter_out // 计数器输出
); 

//-------------Input Ports-----------------------------
input clock ;
input reset ;
input enable ;
//-------------Output Ports----------------------------
output [3:0] counter_out ;

//-------------Input ports Data Type-------------------
// 输入必须是wire变量  
wire clock ;
wire reset ;
wire enable ;
//-------------Output Ports Data Type------------------
// 输出可以是wire或者reg
reg [3:0] counter_out ;

//------------Code Starts Here-------------------------
// 这个计数器是时钟上升沿有效的
always @ (posedge clock)
begin : COUNTER // Block名
  //在每一个时钟上升沿,如果复位有效,则输出是4'b0000
  if (reset == 1'b1) begin
    counter_out <=  #1  4'b0000;
  end
  //如果使能有效,则输出递增
  else if (enable == 1'b1) begin
    counter_out <=  #1  counter_out + 1;
  end
end 

endmodule 


        任何数字电路,无论复杂与否都需要进行测试以验证其功能的正确性。

        对于计数器,我们需要提供时钟和复位信号。一旦计数器不在复位状态,我们将启用输入切换到计数器,并检查波形以查看计数器是否在正确计数。

        这是在 Verilog 的 testbench 中完成的。对于这个计数器,我们设计的testbench是这样的:

`include "first_counter.v"
module first_counter_tb();
//声明输入(reg)与输出(wire)
reg clock, reset, enable;
wire [3:0] counter_out;

//初始化所有变量
initial begin        
  $display ("time\\t clk reset enable counter");	
  $monitor ("%g\\t %b   %b     %b      %b", 
	  $time, clock, reset, enable, counter_out);	
  clock = 1;       		// 初始化时钟信号
  reset = 0;       		// 初始化复位信号
  enable = 0;      		// 初始化使能信号
   #5  reset = 1;       // 置位复位信号
   #10  reset = 0;      // 失效复位信号
   #10  enable = 1;     // 置位使能信号
   #100  enable = 0;    // 失效使能信号
   #5  $finish;         // 结束仿真
end

// 生成时钟信号
always begin
   #5  clock = ~clock; // 每5个单位时钟翻转一次
end

// 被测模块
first_counter U_counter (
	clock,
	reset,
	enable,
	counter_out
);

endmodule

        这个testbench由时钟发生器(clock gen)、复位控制(reset logic)、使能控制(enable logic)和监控/验证逻辑(monitor/checker)组成。

        这是仿真完成后打印的结果,可以看到计数器的工作是符合预期的。

 time     clk reset enable counter
 0        1   0     0      xxxx
 5        0   1     0      xxxx
 10       1   1     0      xxxx
 11       1   1     0      0000
 15       0   0     0      0000
 20       1   0     0      0000
 25       0   0     1      0000
 30       1   0     1      0000
 31       1   0     1      0001
 35       0   0     1      0001
 40       1   0     1      0001
 41       1   0     1      0010
 45       0   0     1      0010
 50       1   0     1      0010
 51       1   0     1      0011
 55       0   0     1      0011
 60       1   0     1      0011
 61       1   0     1      0100
 65       0   0     1      0100
 70       1   0     1      0100
 71       1   0     1      0101
 75       0   0     1      0101
 80       1   0     1      0101
 81       1   0     1      0110
 85       0   0     1      0110
 90       1   0     1      0110
 91       1   0     1      0111
 95       0   0     1      0111
 100      1   0     1      0111
 101      1   0     1      1000
 105      0   0     1      1000
 110      1   0     1      1000
 111      1   0     1      1001
 115      0   0     1      1001
 120      1   0     1      1001
 121      1   0     1      1010
 125      0   0     0      1010

        看数据多少有点不够直观,那我们也可以直接来看仿真的波形:

        从波形图可以看到:首先复位;复位完成后从0开始依次递增计数。 


  • 📣您有任何问题,都可以在评论区和我交流📃!
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net
  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

VERI-ZEXE: Decentralized Private Computation with Universal Setup

1. 引言

Espressosy团队开发了一种去中心化隐私计算系统(Decentralized Private Computation,DPC)——VERI-ZEXE,其支持universal setup。具体见Alex Luoyuan Xiong 2022年论文《VERI-ZEXE: Decentralized Private Computation with Universal Setup》。

开源代码见:

为便于 与Aleo SnarkVM testnet2早期版本(不包含testnet3及之后的版本)之前的DPC模型 对比,2022年论文《VERI-ZEXE: Decentralized Private Computation with Universal Setup》第4章中,阐述了对SnarkVM的代码进行了修改,对比发现,VERI-ZEXE生成交易的速度比SnarkVM快约9倍,使用的内存少约2.6倍。

VERI-ZEXE将用于CAPE的后续版本中,在保持可配置资产隐私性的同时,可支持任意用户自定义资产策略。

2. ZEXE背景知识及不足

现有的智能合约系统,如以太坊和Solona,为Web3创新的绝佳温床。但是,这些系统均受限于隐私或(和)可扩展性。为确保公开可验证下,所有的 程序状态和状态变化都是公开透明的,牺牲了隐私,所有的(全)节点都需要重新执行所有的交易或计算,影响了扩展性。

2019年,Bowe等人提出了一种名为decentralized private computation(DPC,去中心化隐私计算)的方案:

  • 用户可在链下执行任意计算,使用ZKP来向链上提交一笔交易以证明该计算的正确性。

为实例化该DPC方案,Bowe等人实现了名为ZEXE(zk-execution)的系统,可解决以上隐私性和扩展性的问题。大体上,ZEXE是“programmable ZCash”,由 单一应用系统 到 智能合约系统 过渡的同时,保留了隐私属性。

2.1 ZEXE VS. ZK-Rollup

ZEXE 链下计算、链上验证计算完整性证明,听起来与zk-rollup类似。

  • ZEXE中的用户生成交易有效性证明,将交易直接发送到链上
  • zk-rollup中的用户将交易发送给rollup validators,由rollup validators生成zk proof发送到链上。

从技术上说,ZEXE并不关心链下计算是如何完成的——是由单个用户,还是由多用户MPC协议,或者是以rollup-server形式完成的。为此,可认为ZEXE和zk-rollup是2种互补的方案。

2.2 ZEXE显著特性

ZEXE的显著特性有:

  • 1)数据隐私以及函数隐私:ZEXE可隐藏所有函数状态,以及函数调用的输入/输出(数据隐私),以及每笔交易具体触发了哪个函数/程序(函数隐私)。即使后续有多种隐私智能合约方案,ZEXE仍是唯一可实现函数隐私的方案。
  • 2)可编程性:ZEXE用户可为某record附加任意policies/predicates(所谓record,类似Bitcoin Script),record可指定相关程序状态的变更规则。Bowe等人还展示了如何在ZEXE模式下编程实现用户自定义资产、DEXes以及监管合规的稳定币。
  • 3)简洁验证:链上validators无需重新执行该计算。相反,链上validators仅需验证该short transaction validity proof,无论链下计算多复杂,链上验证时间均为contant time。

现有的实现(SnarkVM testnet1 和 SnarkVM testnet2)除具有以上特性之外,还存在以下待改进之处:

  • 1)circuit-specific setup:ZEXE(SnarkVM testnet1)使用类似GM17和Groth16的non-universal SNARK来证明合约执行的正确性,需要为每个应用/程序做一个trusted setup,几乎不具备实用性。
  • 2)性能:具有universal SNARK的ZEXE(SnarkVM testnet2),其性能有大幅下降——由于通用SNARK验证逻辑的复杂性更高,以及ZEXE需为编码了SNARK校验逻辑的statement生成SNARK证明。

3. VERI-ZEXE: universal setup without performance loss

VERI-ZEXE:

  • 在保持了原始ZEXE所有特性和属性的前提下,引入了一些优化措施,降低了universal SNARK verifier gadget的circuit复杂性。

首先,将VERI-ZEXE与ZEXE进行了对比,如以2-input-2-output交易为例,在AMD EPYC 7R13 at 2.65 GHz with 64 cores and 128 GB of RAM上的性能对比(交易生成时间(即Execute算法执行时间)、内存使用情况、交易有效性证明size)为:【交易生成速度要快将近9倍,而内存使用改进了约2.6倍。

其次,将VERI-ZEXE与SnarkVM testnet2进一步对比,outer circuit(用于depth-2 proof composition) size要小很多,使得prover time能快一个量级,从而具有更快的交易生成:

最后,espressosys团队实现了TurboPlonk和UltraPlonk约束系统,并将其作为基石用于VERI-ZEXE中,可大幅降低约束开销。
基于TurboPlonk设计,各主要密码学基石和代数运算的PLONK约束数为:

4. VERI-ZEXE + CAPE: customizable asset policy

ZEXE仍存在一些挑战,如:

  • 并发问题(当多个用户试图同时变更某共享状态)
  • 原子性组合能力(在ZEXE中实现类似Flashloan这样的应用需要名为“in-bundle accumulation”技术,需要对ZEXE的record nano-kernel(RNK)进行小调整)
  • 在UTXO模式下进行predicate programming的难度(现有方案,如Chialisp

由于ZEXE存在以上问题,其并不是隐私智能合约设计的银弹,对于用户间具有最小共享状态,并采用UTXO模式的情况下,采用ZEXE可具有高并发性和低交易依赖项的优势。CAPE就是一个很好的例子。

当前,CAPE协议中仅支持预定义的资产策略集合(如,启动minting、匿名转账、冻结公钥、委托查看策略等),而不是动态的、用户自定义的资产策略。假设你想创建一种新的“concert token”,总供应量为1000,只能对指定的地址付款后才能mint,这种关联新concert token的新minting策略,超过了当前CAPE的能力范围。而未来VERI-ZEXE可使其成为可编程性可能。

参考资料

[1] VERI-ZEXE: Decentralized Private Computation with Universal Setup

附录A. Aleo的SnarkVM

Aleo的SnarkVM经历过多轮迭代:

  • 1)Aleo的testnet1为S&P19论文中ZEXE的忠实实现,其需要application-specific trusted setup。
  • 2)Aleo的testnet2早期版本中:将生成brith/death predicates proof的证明系统由GM17转换为Marlin,不再是application-specific trusted setup,而成为了“universal” setup。
  • 3)Aleo的testnet2后期及之后版本中:改变了其原有的DPC模型,通过简化模型但限制了其可编程性(如,不允许inter-program call)。
  • 4)Aleo的testnet3:采用了简化并限制后的DPC模型。

以上是关于ASIC-WORLD Verilog第一个Verilog代码的主要内容,如果未能解决你的问题,请参考以下文章

数字IC入门之一(Verilog)

你知道Verilog HDL程序是如何构成的吗

第一个Verilog程序:通用加法器

VERI-ZEXE: Decentralized Private Computation with Universal Setup

verilog三段式状态机中的问题,第三个always

c_cpp Veri tiplerininbellektekapladıklarıalalan