一段比较有意思的代码——介绍system verilog中的新增幅值语句

system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用。

下面是一段有意思的代码,覆盖了一些用法。

 1 package definitions;
 2     typedef enum logic [2:0] {ADD,SUB,MULT,DIV,SL,SR} opcode_t;
 3     typedef enum logic {UNSIGNED, SIGNED} operand_type_t;
 4     typedef union packed {
 5         logic [23:0] u_data;
 6         logic signed [23:0] s_data;
 7     } data_t;
 8     typedef struct          packed {
 9         opcode_t opc;
10         operand_type_t op_type;
11         data_t op_a;
12         data_t op_b;
13     } instruction_t;
14 endpackage // definitions
15
16     import definitions::*; // import package into $unit space
17
18 module alu (input instruction_t instr, output data_t alu_out);
19     always_comb begin
20         if (instr.op_type == SIGNED) begin
21             alu_out.s_data = instr.op_a.s_data;
22             unique case (instr.opc)
23                 ADD : alu_out.s_data += instr.op_b.s_data;
24                 SUB : alu_out.s_data -= instr.op_b.s_data;
25                 MULT : alu_out.s_data *= instr.op_b.s_data;
26                 DIV : alu_out.s_data /= instr.op_b.s_data;
27                 SL : alu_out.s_data <<<= 2;
28                 SR : alu_out.s_data >>>= 2;
29             endcase
30             176 SystemVerilog for Design
31               end
32         else begin
33             alu_out.u_data = instr.op_a.u_data;
34             unique case (instr.opc)
35                 ADD : alu_out.u_data += instr.op_b.u_data;
36                 SUB : alu_out.u_data -= instr.op_b.u_data;
37                 MULT : alu_out.u_data *= instr.op_b.u_data;
38                 DIV : alu_out.u_data /= instr.op_b.u_data;
39                 SL : alu_out.u_data <<= 2;
40                 SR : alu_out.u_data >>= 2;
41             endcase
42         end
43     end
44 endmodule

代码中使用了package,structure以及一些新加的赋值语句。

注意这里使用的是always_comb,因为这些赋值语句都相当于阻塞赋值。

时间: 2024-08-02 03:22:34

一段比较有意思的代码——介绍system verilog中的新增幅值语句的相关文章

给大家看段比较有意思的代码

package code.classloader; public class Interesting { public static int count1; public static int count2 = 0; public static Interesting ins = new Interesting(); private Interesting() { count1++; count2++; } public static Interesting getInstance() { re

FPGA小白学习之路(1) System Verilog的概念以及与verilog的对比

转自CSDN:http://blog.csdn.net/gtatcs/article/details/8970489 SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型.结构.压缩和非压缩数组. 接口.断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力.SystemVerilog由Acceller

System Verilog学习笔记(一)

1.var/reg与bit/logic 异: reg——>在verilog hdl中用来声明寄存器: var——>在SV中所有暂存的资源视为变量,即variable:同: reg和var都会消耗FPGA资源.注: a.SV中保留了reg关键字,reg与var有等价左右. b.SV在声明RAM的时候,也会使用var关键字.例子:reg [3:0] rLED; //verilogvar [3:0] rLED; //sysverilog 2.物理特性寄存器一般有4态,即0,1,x,z verilog

【从头开始写操作系统系列】一致代码段与非一致代码段

上几篇文章,我们一直在讨论的都是 GDT 相关的一些问题,现在我们知道在系统在从实模式向保护模式跳转时,GDT 是必须要准备的结构.在介绍这一跳转之前,这篇文章我们来介绍两个概念:一致代码段和非一致代码段. 首先,我们先来看几个问题: 一致代码段和非一致代码段是什么? 为什么要有一致代码段和非一致代码段? 系统提供怎样的机制来使用户程序访问内核数据? 程序如何在段与段之间跳转? 接下来,我们将讨论上述这些问题. 特权级 为了更好的理解之后的问题,我们先来讨论一个概念:特权级. 特权级是一种机制来

分享一段Java搞笑的代码注释

今天在群里看到有人分享了一段搞笑的注释代码,觉得挺好玩的,在这里收藏一下 // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // O\ = /O // ____/`---'\____ // . ' \\| |// `. // / \\||| : |||// // / _||||| -:- |||||- // | | \\\ - /// | | // | \_| ''\---/'' | | // \ .-\__ `-` ___/-. /

一致代码段和非一致代码段

最近在自己动手写操作系统,计算机其实是一个非常复杂的系统.其中包含了很多历史性的问题,让人感到生僻难懂.在CSDN上看到一篇关于一致代码段和非一致代码段的文章,非常好,收藏起来. 原文链接:http://blog.csdn.net/feijj2002_/article/details/4597174 之所以出现这个定义是因为系统要安全:内核要和用户程序分开..内核一定要安全.不能被用户程序干涉.但是有时候用户程序也需要读取内核的某些数据,怎么办呢?操作系统就引入了访问特权等级(0-3)的机制.

10段实用的HTML5代码

1.HTML5编写的CSS ResetCSS Reset也可以写成Reset CSS,即重设浏览器样式. /*   html5doctor.com Reset Stylesheet (Eric Meyer's Reset Reloaded + HTML5 baseline)  v1.4 2009-07-27 | Authors: Eric Meyer & Richard Clark  html5doctor.com/html-5-reset-stylesheet/*/ html, body, d

Android ViewPager实例代码介绍2。

以前写过一篇ViewPager:内容content+指示点的Demo: 这篇文章继续介绍ViewPager:内容content+标题title的Demo. 实现效果图: 源代码: 布局文件:activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"

Entity Framework 实体框架的形成之旅--几种数据库操作的代码介绍(9)

本篇主要对常规数据操作的处理和实体框架的处理代码进行对比,以便更容易学习理解实体框架里面,对各种数据库处理技巧,本篇介绍几种数据库操作的代码,包括写入中间表操作.联合中间表获取对象集合.递归操作.设置单一字段的修改等几种方式. 1.写入中间表操作 一般情况下,我们可以通过执行数据库脚本方式写入. /// <summary> /// 增加用户IP信息 /// </summary> /// <param name="userID"></param&