Verilog case coding style

1、一般情况下,综合器将case语句综合成多路选择器,但也可能综合成优先级译码器。

2、case语句中,如果条件列举不完全,将综合出不必要的锁存器。

综合器指令://synopsys parallel_case & //synopsys full_case

使用//synopsys parallel_case可以引导综合器生成多路选择器。


1 always @(cs_state)
2 begin
3 case(cs_state) // synopsys parallel_case
4 2’b00: next_state = 2’b01;
5 2’b01: next_state = 2’b00;
6 2’b10: next_state = 2’b10;
7 default: next_state = 2’b00;
8 endcase
9 end

使用//synopsys full_case则可以避免生成不必要的锁存器。


1 always @(cs_state)
2 begin
3 case(cs_state) // synopsys full_case
4 2’b00: next_state = 2’b01;
5 2’b01: next_state = 2’b00;
6 2’b10: next_state = 2’b10;
7 endcase
8 end

Guideline1:使用if-else-if编码优先级编/译码器,if-else-if的优先级关系更清楚明了。

Guideline2:使用case实现查表类语句,这能提高代码可读性。

Guideline3:一般情况下不要使用”full_case parallel_case”指令在verilog case语句中,其可能造成综合器和仿真器行为的不一致。

Guideline4:3的例外情况,可使用”full_case parallel_case”指令优化状态机编码。原因很简单,未列完的条件,视为don’t care 其赋值由

综合器自动选择0或1。比起人为的赋值0或1,它能简化逻辑,这点可通过卡诺图化简进行解释。

3、避免case语句生成不必要latch的verilog推荐风格:使用default语句赋default值(0或1),或者在进入case语句后立马赋default值,再对各条件做case分析。

4、case代码举例分析。

ex1:


 1 module mux3c(y,a,b,c,sel);
2 output y;
3 input [1:0] sel;
4 input a,b,c;
5 reg y;
6
7 always @(a or b or c or sel)
8 case(sel)
9 2‘b00: y=a;
10 2‘b01: y=b;
11 2‘b10; y=c;
12 default: y=1‘bx;
13 endcase
14 endmodule

上述代码对综合器:当sel=11时,y为don’t care ,并且综合器使用卡诺图化简的方式进行逻辑优化;

对于仿真器:当sel=11时,y值为x,未知态。因此,这也会导致综合器和仿真器行为不一致(对综合器而言,其效果和使用full_case一样)。

ex2:


 1 module mux3c(y,a,b,c,sel);
2 output y;
3 input [1:0] sel;
4 input a,b,c;
5 reg y;
6
7 always @(a or b or c or sel)
8 case(sel) //synopsys full_case
9 2‘b00: y=a;
10 2‘b01: y=b;
11 2‘b10; y=c;
12 endcase
13 endmodule

上述代码对综合器,sel=11时,y为don’t care,但对仿真器会是锁存器(y值保持不变)。

ex3:使用default赋确定的default值(非x值)


 1 module mux3c(y,a,b,c,sel);
2 output y;
3 input [1:0] sel;
4 input a,b,c;
5 reg y;
6
7 always @(a or b or c or sel)
8 case(sel)
9 2‘b00: y=a;
10 2‘b01: y=b;
11 2‘b10; y=c;
12 default: y=a;//or y=1‘b0;
13 endcase
14 endmodule

通过确定的值避免仿真器出现X值。

ex4:进入case语句后立马赋default值


 1 module mux3c(y,a,b,c,sel);
2 output y;
3 input [1:0] sel;
4 input a,b,c;
5 reg y;
6
7 always @(a or b or c or sel)
8 y=1‘b0;
9 case(sel)
10 2‘b00: y=a;
11 2‘b01: y=b;
12 2‘b10; y=c;
13 endcase
14 endmodule

通过先赋值的方式,避免忘记写完整个case条件而出现latch。

Verilog case coding style,码迷,mamicode.com

时间: 2024-08-09 13:24:23

Verilog case coding style的相关文章

Google's C++ coding style

v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件        #define用法        前向声明        内联函数        -inl.h文件        函数参数顺序        include的命名和顺序    作用域        命名空间            未命名空间            命名空间       

linux c coding style

Linux kernel coding style This is a short document describing the preferred coding style for the linux kernel. Coding style is very personal, and I won't _force_ my views on anybody, but this is what goes for anything that I have to be able to mainta

Java coding style - Part one

Java coding style: 1. Factory method should be stateless. State normally refers to the member variables of class. Stateless, more precisely, it means immutable. Factory is just to create objects, and one call should not affect anothers, if it is muta

编码风格——linux内核开发的coding style

总结linux内核开发的coding style, 便于以后写代码时参考. 下面只是罗列一些规则, 具体说明可以参考: 内核源码(Documentation/CodingStyle) 01 - 缩进 缩进用 Tab, 并且Tab的宽度为8个字符 swich 和 case对齐, 不用缩进 switch (suffix) { case 'G': case 'g': mem <<= 30; break; case 'M': case 'm': mem <<= 20; break; cas

编程风格(Coding Style)要求

编程风格(Coding Style)要求2.1.1 文件(1) 每个模块(module)一般应存在于单独的源文件中,通常源文件名与所包含模块名相同.(2) 每个设计文件开头应包含如下注释内容:? 年份及公司名称.? 作者.? 文件名.? 所属项目.? 顶层模块.? 模块名称及其描述.? 修改纪录.2.1.2 大小写(1) 如无特别需要,模块名和信号名一律采用小写字母.(2) 为醒目起见,常数(`define定义)/参数(parameter定义)采用大写字母.2.1.3 标识符(1) 标识符采用传

[CPP] Coding Style

C++ Coding Style C++很多强大的语言特性导致它的复杂,其复杂性会使得代码更容易出现bug.难于阅读和维护. 本Coding Style用来约束C++编程,使得代码在有效使用C++语言特性的同时易于管理[代码的一致性高于一切]. 参考:<Google C++ Style Guide> 分类 标题 规则 备注(示例) 头文件 每个.cc文件都应对应一个.h文件 #define保护 1.  #define PROJECT_PATH_FILE_H_ 防止.h文件被多重包含: 1. P

Google C++ Coding Style:引用参数

Google C++ Coding Style定义 输入参数以值或者const引用形式传入,输出参数使用指针. 所有以引用形式输入参数必须加上const,即const T&的形式. 即如下形式: void Foo(const string &in, string *out); 在如下情况下, 可以使用const T*的形式: * 需要进行指针的判空 (即空指针是合理的). * 需要使用到输入参数的指针或引用形式. 为什么要使用const T&形式? 以值传入是最为安全的形式,因为它

Python&#39;s Coding Style

一个程序员良好的素养可以从他的代码风格里看出. Python官方的开发者指南,PEP8中,列举了Style Guide for Python Code. 摘录The Python's Tutorial中的依依列出. 1.用4空格缩进,而不是tab键. 2.使每行不超过79个字符,目的是小屏幕用户也能很好的阅读. 3.用空一行的方式去把函数,类,和函数中大的代码块分开. 4.如果可能的话,尽量把注释写在一行里. 5.Use docstrings.使用文档字符串.(Ps.这个可得利用好了) 6.在操

python coding style guide 的高速落地实践

python coding style guide 的高速落地实践 机器和人各有所长,如coding style检查这样的可自己主动化的工作理应交给机器去完毕,故发此文帮助你在几分钟内实现coding style的自己主动检查. 1.有哪些著名的Python Coding Style Guide PEP8 https://www.python.org/dev/peps/pep-0008/ 发明Python语言丰碑人物Guido van Rossum的亲自写的Coding Style, 知名度5颗