一段比较有意思的代码——介绍system verilog中的新增幅值语句
2015-08-04 14:21
791 查看
system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用。
下面是一段有意思的代码,覆盖了一些用法。
代码中使用了package,structure以及一些新加的赋值语句。
注意这里使用的是always_comb,因为这些赋值语句都相当于阻塞赋值。
下面是一段有意思的代码,覆盖了一些用法。
package definitions; typedef enum logic [2:0] {ADD,SUB,MULT,DIV,SL,SR} opcode_t; typedef enum logic {UNSIGNED, SIGNED} operand_type_t; typedef union packed { logic [23:0] u_data; logic signed [23:0] s_data; } data_t; typedef struct packed { opcode_t opc; operand_type_t op_type; data_t op_a; data_t op_b; } instruction_t; endpackage // definitions import definitions::*; // import package into $unit space module alu (input instruction_t instr, output data_t alu_out); always_comb begin if (instr.op_type == SIGNED) begin alu_out.s_data = instr.op_a.s_data; unique case (instr.opc) ADD : alu_out.s_data += instr.op_b.s_data; SUB : alu_out.s_data -= instr.op_b.s_data; MULT : alu_out.s_data *= instr.op_b.s_data; DIV : alu_out.s_data /= instr.op_b.s_data; SL : alu_out.s_data <<<= 2; SR : alu_out.s_data >>>= 2; endcase 176 SystemVerilog for Design end else begin alu_out.u_data = instr.op_a.u_data; unique case (instr.opc) ADD : alu_out.u_data += instr.op_b.u_data; SUB : alu_out.u_data -= instr.op_b.u_data; MULT : alu_out.u_data *= instr.op_b.u_data; DIV : alu_out.u_data /= instr.op_b.u_data; SL : alu_out.u_data <<= 2; SR : alu_out.u_data >>= 2; endcase end end endmodule
代码中使用了package,structure以及一些新加的赋值语句。
注意这里使用的是always_comb,因为这些赋值语句都相当于阻塞赋值。
相关文章推荐
- php 连接数据库
- C++中的引用
- [LeetCode] Gray Code
- C语言中内存对齐规则讨论
- casperjs 的API-casper模块
- maven搭建struts2
- 详解ASP.NET七大身份验证方式以及解决方案
- C++:vector利用swap()函数进行内存释放源码
- java注解简介
- VS2010+Qt5.3.1+qt-vs-addin插件
- PHP socket模拟POST请求
- PHP实现程序单例运行
- Java NIO系列教程(七) DatagramChannel
- Java NIO系列教程(六) ServerSocketChannel
- Java NIO系列教程(五) SocketChannel
- 【转】缓冲区设计--环形队列(C++)
- eclipse生成jar包
- Think in java 笔记二(第3~4章)
- Eclipse找不到Courier New字体的解决方法
- 代码注入之远程线程篇