使用 IEEE (1735) Verilog 标准机制进行 IP 保护

在跑仿真的时候,如果使用第三方IP,经常会遇到第三方IP中有加密代码,有时又会遇到同样的环境既可以用VCS跑,也可以用XRUN跑,我就好奇第三方IP如何支持两个公司的加解密方式的。

以前只是知道VCS使用`protect-`endprotect 来加密代码,XRUN使用如下格式

// pragma protect
// pragma protect begin

需要加密的代码
// pragma protect end

两家好像是不兼容的,经过查阅VCS和XRUN的文档,最终发现了端倪,他们可以使用IEEE-1735 加密格式(具体语法这里不做介绍)。

The syntax of header_file is as follows:

复制代码
`protect data_method = "data_method"
复制代码
`protect key_keyowner="owner_name"
复制代码
`protect key_keyname="owner_key_name"
复制代码
`protect key_method="encryption_method_name"
复制代码
`protect key_public_key
复制代码
<content_representing_the_public_encryption_key>

VCS 官方给出如下步骤:

  1. 不是 VCS 用户(或没有 VCS 许可证)的 IP 供应商或团队希望提供 IEEE-1735 加密格式的 IP 用于 VCS 仿真。
  2. 已成为 VCS 用户的 IP 供应商或团队希望为 VCS 仿真提供 IEEE-1735 加密格式的 IP。

在这两种情况下,建议执行加密的 IP 供应商/团队遵循以下步骤,以提高最终用户的可用性。

  1. 联系 Synopsys (vcs_support@synopsys.com) 获取 VCS 公共加密密钥
  2. 使用获取的 VCS 公共加密密钥加密文件
  3. 将加密文件提供给客户/同行团队--VCS 终端用户

最终用户应能编译这些加密文件,而无需担心公开密钥或解密。

通过上述流程,(VCS)最终用户无需从 IP 提供商处获取任何密钥,IP 提供商也无需担心与所有客户共享 VCS 公钥。

因为他们使用的RSA加密算法,由公钥加密,私钥解密,公钥是公开的,私钥应该是内置在仿真器中,例如Synopsys有如下可以查到如下公钥:

`pragma protect data_method = "AES128-CBC"
`pragma protect key_keyowner="Synopsys"
`pragma protect key_method="rsa"
`pragma protect key_keyname="SNPS-VCS-RSA-1"
`pragma protect key_public_key
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjJMv7PI1V+DJDaHZuV
IFbAXvr6/tEpuM8cAKFuvpIoO6PE3DRqEwaHEJRyIsFnJnavVJ33+Kub54
Cr/9JCh6fnQhtAmKt/nAznESOLExCKO1tmjYNCXLJ+QqWFoCuDuI4QS8Ru
y1u3RwABCw7ESQwwIuVSZpOghOvjrPHzvlc0QIDAQAB
`pragma protect key_block

Cadence 有如下公钥:

`pragma protect key_keyowner = "Cadence Design Systems.", key_method = "rsa", key_keyname = "CDS_RSA_KEY_VER_2"
`pragma protect key_public_key
MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQADgA/y8ZoT7v4vKFrwcdrL/Tc2V+2Dczr6
oNnZchFp8c1O+Ja4bHceMRSqm8+N0d98q4nu6FW1ipNNaB4UlxbVvv4vNkXixb9CaenedZA/K2uA
uWZD+daC9QroUm8o8OIft0evdGfXQpy4WFA1Vs44WeHU5hO15F8ZzUxXINR/HXNZdeX4hfaTFhTE
uebeoBx9CwQII6o194UzBr/R35c4n8EwXuRLgjuY6gnirkRdI/fhhUDsvwNdruEJ03bYc91nHEhz
HarHnXt58KYZhjgCbgXlk0bPwQGMiSV+MQvcd0k1emyhsLc9ylLuIZJkv2zE3BNyXTCjaLqyuNwx
xtn1AgMBAAE=

我们将上面的内容添加在自己的代码中:

module test();

`pragma protect version = 1
`pragma protect data_method = "AES128-CBC"
`pragma protect key_keyowner="Synopsys"
`pragma protect key_method="rsa"
`pragma protect key_keyname="SNPS-VCS-RSA-1"
`pragma protect key_public_key
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjJMv7PI1V+DJDaHZuV
IFbAXvr6/tEpuM8cAKFuvpIoO6PE3DRqEwaHEJRyIsFnJnavVJ33+Kub54
Cr/9JCh6fnQhtAmKt/nAznESOLExCKO1tmjYNCXLJ+QqWFoCuDuI4QS8Ru
y1u3RwABCw7ESQwwIuVSZpOghOvjrPHzvlc0QIDAQAB
`pragma protect key_block

`pragma protect key_keyowner = "Cadence Design Systems.", key_method = "rsa", key_keyname = "CDS_RSA_KEY_VER_2"
`pragma protect key_public_key
MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQADgA/y8ZoT7v4vKFrwcdrL/Tc2V+2Dczr6
oNnZchFp8c1O+Ja4bHceMRSqm8+N0d98q4nu6FW1ipNNaB4UlxbVvv4vNkXixb9CaenedZA/K2uA
uWZD+daC9QroUm8o8OIft0evdGfXQpy4WFA1Vs44WeHU5hO15F8ZzUxXINR/HXNZdeX4hfaTFhTE
uebeoBx9CwQII6o194UzBr/R35c4n8EwXuRLgjuY6gnirkRdI/fhhUDsvwNdruEJ03bYc91nHEhz
HarHnXt58KYZhjgCbgXlk0bPwQGMiSV+MQvcd0k1emyhsLc9ylLuIZJkv2zE3BNyXTCjaLqyuNwx
xtn1AgMBAAE=
`pragma protect key_block

`pragma protect begin

要加密的代码
`pragma  protect end


endmodule

然后使用Synopsys或者Cadence提供的工具,就可以对代码就行加密了,加密后的代码就同时支持VCS和XRUN仿真了。

下面就Synopsys和Cadence的加密方法简单介绍:

有如下RTL代码:

module m ();
wire r;
assign r = 1'b0;
`pragma protect begin

logic l;
assign l = 1'b1;
`pragma protect end
initial #10 $finish();
endmodule

VCS加密方式:

创建toolkeys文件

//`pragma protect version = 1
`pragma protect data_method = "AES128-CBC"
`pragma protect key_keyowner="Synopsys"
`pragma protect key_method="rsa"
`pragma protect key_keyname="SNPS-VCS-RSA-1"
`pragma protect key_public_key
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjJMv7PI1V+DJDaHZuV
IFbAXvr6/tEpuM8cAKFuvpIoO6PE3DRqEwaHEJRyIsFnJnavVJ33+Kub54
Cr/9JCh6fnQhtAmKt/nAznESOLExCKO1tmjYNCXLJ+QqWFoCuDuI4QS8Ru
y1u3RwABCw7ESQwwIuVSZpOghOvjrPHzvlc0QIDAQAB

执行如下命令

vcs -full64 -lca test.sv -ipprotect toolkeys -ipopt=overwrite -ipopt=partialprotect

命令执行完会生成test.svp的文件

Cadence加密方式:

有如下RTL代码:

module m ();
wire r;
assign r = 1'b0;

`pragma protect version = 1
`pragma protect data_method = "AES128-CBC"
`pragma protect key_keyowner="Synopsys"
`pragma protect key_method="rsa"
`pragma protect key_keyname="SNPS-VCS-RSA-1"
`pragma protect key_public_key
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjJMv7PI1V+DJDaHZuV
IFbAXvr6/tEpuM8cAKFuvpIoO6PE3DRqEwaHEJRyIsFnJnavVJ33+Kub54
Cr/9JCh6fnQhtAmKt/nAznESOLExCKO1tmjYNCXLJ+QqWFoCuDuI4QS8Ru
y1u3RwABCw7ESQwwIuVSZpOghOvjrPHzvlc0QIDAQAB
`pragma protect key_block


`pragma protect version = 1
//`pragma protect data_method = "AES128-CBC"
`pragma protect key_keyowner = "Mentor Graphics Corporation"
`pragma protect key_method = "rsa"
`pragma protect key_keyname = "MGC-VERIF-SIM-RSA-1"
`pragma protect key_public_key
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnJfQb+LLzTMX3NRARsv7A8+LV5SgMEJCvI
f9Tif2emi4z0qtp8E+nX7QFzocTlClC6Dcq2qIvEJcpqUgTTD+mJ6grJSJ+R4AxxCgvHYUwoT
80Xs0QgRqkrGYxW1RUnNBcJm4ZULexYz8972Oj6rQ99n5e1kDa/eBcszMJyOkcGQIDAQAB
`pragma protect key_block

`pragma protect version = 1
`pragma protect key_keyowner = "Cadence Design Systems.", key_method = "rsa", key_keyname = "CDS_RSA_KEY_VER_2"
`pragma protect key_public_key
MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQADgA/y8ZoT7v4vKFrwcdrL/Tc2V+2Dczr6
oNnZchFp8c1O+Ja4bHceMRSqm8+N0d98q4nu6FW1ipNNaB4UlxbVvv4vNkXixb9CaenedZA/K2uA
uWZD+daC9QroUm8o8OIft0evdGfXQpy4WFA1Vs44WeHU5hO15F8ZzUxXINR/HXNZdeX4hfaTFhTE
uebeoBx9CwQII6o194UzBr/R35c4n8EwXuRLgjuY6gnirkRdI/fhhUDsvwNdruEJ03bYc91nHEhz
HarHnXt58KYZhjgCbgXlk0bPwQGMiSV+MQvcd0k1emyhsLc9ylLuIZJkv2zE3BNyXTCjaLqyuNwx
xtn1AgMBAAE=
`pragma protect key_block


`pragma protect begin

logic l;
assign l = 1'b1;
`pragma protect end
initial #10 $finish();
endmodule

执行如下命令:

xmprotect simple_3vendor_keys.v -lang vlog -overwrite -messages

命令执行完会生成test.svp的文件

相关推荐
蜡笔小新星1 小时前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习
墨@#≯2 小时前
机器学习系列篇章0 --- 人工智能&机器学习相关概念梳理
人工智能·经验分享·机器学习
唐·柯里昂79817 小时前
[3D打印]拓竹切片软件Bambu Studio使用
经验分享·笔记·3d
Word码18 小时前
数据结构:栈和队列
c语言·开发语言·数据结构·经验分享·笔记·算法
我命由我1234518 小时前
SSL 协议(HTTPS 协议的关键)
网络·经验分享·笔记·学习·https·ssl·学习方法
数据分析螺丝钉20 小时前
力扣第240题“搜索二维矩阵 II”
经验分享·python·算法·leetcode·面试
云端奇趣21 小时前
探索 3 个有趣的 GitHub 学习资源库
经验分享·git·学习·github
万界星空科技1 天前
界星空科技漆包线行业称重系统
运维·经验分享·科技·5g·能源·制造·业界资讯
IG工程师1 天前
关于 S7 - 1200 通过存储卡进行程序更新
经验分享·笔记·自动化
源代码•宸1 天前
Leetcode—76. 最小覆盖子串【困难】
c++·经验分享·算法·leetcode·滑动窗口