input wire a
//等价于
input a
知识点大概同上,注意异或为^,异或非(即同或)为!^
很简单 中间变量的定义
简单的与或门
如
//correct
wire [7:0] a;
//wrong
wire a[7:0];
而调用时则在变量名之后
b = a[3:0];
//wrong
wire [3:0] a;
...
b = a[0:3];//字节序不一致
如果assign语句的左边变量没有声明,将自动定义为一个1bit net型变量,这很可能产生bug
wire [2:0] a, c; // Two vectors
assign a = 3'b101; // a = 101
assign b = a; // b = 1 implicitly-created wire
assign c = b; // c = 001 <-- bug
my_module i1 (d,e); // d and e are implicitly one-bit wide if not declared.
// This could be a bug if the port was intended to be a vector.
6中提到多bit变量其维度声明在其变量名之前,这实际上是一种packed的变量,如
wire [7:0] a;
我们在调用a时,不必具体指定调用a的那几位,默认a为一个8维变量
而若维度声明在变量后,即为unpacked变量,常用于声明memory,如
reg [7:0] mem [15:0];
这实际上声明了一个大小为16的memory,字长为8bit,在调用时
out <= mem[0];
则out取出的是mem的第0个数据,字长为8bit。
简单 按位与和逻辑与的区别
简单,该题用归约操作符可以减少代码量。
简单,连接符的使用。
assign a = {b,b,b,b,b};
//equal to
assign a = {5{b}};
// 有符号扩展,7位a扩展为32位b
assign b = {{24{a[7]}},a};
今天刷完module模块的9题
这几道题都是模块实例化。
mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) );
//out,in1,in2为mod_a的端口名
简单。归约运算符。
generate
genvar i;
for (i = 0; i <= 7; i = i + 1) begin: u
adder8 add (sum[i], co[i+1], a1[i], a2[i], ci[i]);
end
endgenerate
module driver (in, out, en);
input [2: 0] in;
output [2: 0] out;
input en;
bufif0 u[2:0] (out, in, en); // array of buffers
endmodule
今天把verilog language一大章刷完了。明天开始circuit。
后天考试,今天刷完了simulation一章。
发现越到后面知识点已经没什么好记下来的了,所以之后就改成打卡吧~(如果有遇到不会的还是会记下来的)
考试前一天,刷了两题状态机
wire~7420chip
truth tables ~ even longer vectors
2-to-1 multiplexer ~ 256-to-1 4-bit multiplexer
今天再刷题时,遇到了报错
always@(*)
out = in[sel*4+3:sel];
报错
Error (10734): Verilog HDL error at top_module.v(6): sel is not a constant File: /var/www/verilog/work/vlg6VPWLT_dir/top_module.v Line: 6
查了一下,是由于range的上限不能是变量:
//正确
assign leadingBits[3] = magnitude[bitsEnd + 3];
assign leadingBits[2] = magnitude[bitsEnd + 2];
assign leadingBits[1] = magnitude[bitsEnd + 1];
assign leadingBits[0] = magnitude[bitsEnd + 0];
//报错
assign leadingBits[3:0] = magnitude[bitsEnd + 3:bitsEnd];
解决方法:
(1)可以用+:,-:操作符来表示:见https://blog.csdn.net/feiliantong/article/details/107782129
(2)拼接符
//方法1
always@(*)
out = in[sel*4 +: 4];
//方法2
assign out = {in[sel*4+3], in[sel*4+2], in[sel*4+1], in[sel*4+0]};
half adder ~ 4-digital BCD adder
3-variable ~ k-map implemented with mutiplexer
D flip-flop ~ dual-edge triggered flip flop
always块中,对时钟同时上升和下降沿触发会报错
always@(posedge clk ,negedge clk)//报错
若要实现双边沿触发的触发器,需要一个上升沿触发的触发器和一个下降沿触发的触发器。代码如下:
module top_module (
input clk,
input d,
output q
);
reg q_pos,q_neg;
always@(posedge clk)
q_pos <= d;
always@(negedge clk)
q_neg <= d;
assign q = clk ? q_pos : q_neg;
endmodule
注意进位条件,高位进位的条件为地位全部为最高位。