总结1: 组合逻辑赋值出现的问题
tri信号上升沿拉高tripos_clrpos,clr的上升沿拉低tripos_clrpos,
最开始的写法如下图,其中tri_pos和clr_pos分别是检测到,对应的上升沿,然而该描述还是功能模块不清
改进后的写法
然而换了vcs仿真,编译会卡在生成波形那,
verdi end of traversing
其实是我写的有问题,上面的写法存在两个问题
- tripos_clrpos信号初始值得靠ena进行赋值
- 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中的位扩展
总结9: Verilog中数字省略位宽的写法
如果进制格式也省略(比如interger)
总结10:Verilog Q&A过程
代码提交给后面的人,要用(spyglass)检查一遍
总结11:两个工具编译报错不一样
VCS报错的原因,当PAD_NUM等于0时会违例
总结12:define的用法
总结13 前端需要的知识技能
通过逻辑综合,电路是什么样子,Verilog testbech, sv testbench,UVM testbench,MATLAB, c, c++,verdi速度快,工具
RTL Q&A Leda,前端重在coding, debug,理论,语言,方法学,协议,概念
总结14 integer的使用
integer
- 可以看做是一个有符号的32位的数
- 可以在定义的时候进行初始化
- 可以在块里面进行初始化
总结15 位拼接
我想把高位的MSB个全赋值为1但是这里是会报错的,我就搞不清楚了
总结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