学习笔记2

总结1: 组合逻辑赋值出现的问题

tri信号上升沿拉高tripos_clrpos,clr的上升沿拉低tripos_clrpos,
最开始的写法如下图,其中tri_pos和clr_pos分别是检测到,对应的上升沿,然而该描述还是功能模块不清


image.png

改进后的写法


image.png
就是在tripos_clrpos在tri_pos拉高的时候,tripos_clrpos取反,这样假设的是tripos_clrpos最开始就是0。该方法在vivado下仿真没问题
然而换了vcs仿真,编译会卡在生成波形那,
verdi end of traversing

其实是我写的有问题,上面的写法存在两个问题

  1. tripos_clrpos信号初始值得靠ena进行赋值
  2. else语句后tripos_clrpos=tripos_clrpos;注定要产生锁存器

改进之后的写法:

always@(*) begin
    if(!ena) trineg_clrneg = 1'b0;
    else if(tri_neg) trineg_clrneg = 1'b1;
    else if(clr_neg) trineg_clrneg = 1'b0;
    else             trineg_clrneg = trineg_clrneg_reg;
end

其中trineg_clrneg_reg是trineg_clrneg经过ff的信号

总结2 不能使用变量(即bitsEnd )作为范围的结尾

在Verilog中,您不能使用变量(即bitsEnd )作为范围的结尾。 您可以使用+: / -: 运算符来解决您的问题:
assign leadingBits = magnitude[bitsEnd+3 -: 4];

总结3: Verilog随机函数的使用

产生一个在min, max之间随机数的例子:
EX-3:
reg[23:0] rand;
rand = min+{$random}%(max-min+1);
verilog仿真 random 的选择
在verilog仿真中常用的random有如下三个:

$random
$urandom
$urandom_range(low,high)
//$random的结果不随sv_seed的变化而变化,
//而$urandom和$urandom_range的结果随着sv_seed的变化而变化,
//因此我们可以在代码中使用$urandom和$urandom_range,然后在命令里面改变随机种子,这样就可以使用不同的种子来进行仿真了

总结4: 在Vivado中使用系统的函数,报错

ERROR: [XSIM 43-4287] "E:/ESWIN_Homework/Lab_week3/project_1/RTL/lab11/lab11_tb.v" Line 59. Undefined system task '$fsdbDumpfile'

总结5:位扩展

把1'b1赋值给,多位的值,只有最低位为1

总结6:

VCS -debug_all converter.v编译看下有没有语法错误

总结7 如何理解高阻态

简介:在电子学中,高阻态(英语:High impedance)表示电路中的某个节点具有相对电路中其他点相对更高的阻抗。这个概念在三态逻辑、上拉电阻中有所涉及。在硬件描述语言(如Verilog HDL和VHDL)中,高阻态通常用字母z来表示。

实质:电路分析时高阻态可做开路理解。你可以把它看作输出(输入)电阻非常大。它的极限状态可以认为悬空(开路)。也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态。而实际应用上与引脚的悬空几乎是一样的。

意义:当门电路的输出上拉管导通而下拉管截止时,输出为高电平;反之就是低电平;如上拉管和下拉管都截止时,输出端就相当于浮空(没有电流流动),其电平随外部电平高低而定,即该门电路放弃对输出端电路的控制 。
三态逻辑:在数字电路中,三态逻辑(英语:Three-state logic)允许输出端在0和1两种逻辑电平之外呈现高阻态,等效于将输出的影响从后级电路中移除。这允许多个电路共同使用同一个输出线(例如总线)。

三态输出在寄存器、总线以及7400系列、4000系列等各型号的逻辑IC发挥着重要的作用,并常常内置在其他各种集成电路。除此之外,三态逻辑的典型应用还包括微处理器、存储设备、外设的内部和外部总线。许多设备提供一个OE(Output Enable)用于在低电平时才令输出使能,而在不使能时保持高阻态。

总结8:Verilog中的位扩展

image.png

总结9: Verilog中数字省略位宽的写法

image.png

如果进制格式也省略(比如interger)


image.png

总结10:Verilog Q&A过程

代码提交给后面的人,要用(spyglass)检查一遍

总结11:两个工具编译报错不一样

image.png

VCS报错的原因,当PAD_NUM等于0时会违例

总结12:define的用法

image.png

总结13 前端需要的知识技能

通过逻辑综合,电路是什么样子,Verilog testbech, sv testbench,UVM testbench,MATLAB, c, c++,verdi速度快,工具
RTL Q&A Leda,前端重在coding, debug,理论,语言,方法学,协议,概念

总结14 integer的使用

integer

  • 可以看做是一个有符号的32位的数
  • 可以在定义的时候进行初始化
  • 可以在块里面进行初始化

总结15 位拼接

image.png

我想把高位的MSB个全赋值为1但是这里是会报错的,我就搞不清楚了


image.png

总结16 三段式的写法

always@(current_state or else signal)(敏感列表中存放对状态跳转有影响的信号)
     begin
     next_state=x;    (初始化,使得系统复位进入正确的状态)
     case(current_state)
     s1: if(.....)
 next_state=s2
     .
     .
     .......
     endcase
     end
时序逻辑always块:
always@(posedge clk or negedge rst)
   if(!rst)
     current_state<=IDLE;
   else
     current_state<=next_state;

总结17 Verilog读取文件的方式,写文件的方式

module read_write_file();
    integer fp_r,fp_w;
    integer count;
    reg [9:0] reg1;
 
    initial
        begin
            fp_r=$fopen("data_in.txt","r");//以读的方式打开文件,注意这里是Makefile的相对路径
            fp_w=$fopen("data_out.txt","w");//以写的方式打开文件,
 
            while(! $feof(fp_r))
                begin
                    count=$fscanf(fp_r,"%b" ,reg1) ;//每次读一行
                    $display("%d::::%b",count,reg1) ;//打印输出
                    $fwrite(fp_w,"%b\n",reg1) ;//写入文件
                end
 
            $fclose(fp_r);//关闭已打开的文件
            $fclose(fp_w);
        end
endmodule

总计18 Verilog打印输出固定格式,空格

image.png

总结19 如果要用include文件中的内容,需要先inculude那个文件

image.png

总结20 一般不建议在设计中增加时序延迟

你可能感兴趣的:(学习笔记2)