我有兴趣编写同时更新多个输出的Verilog模块 像下面的代码一样,同时进行3次操作(clk 10):
module mymodule (a,b,c,d,e);
input a;
input b;
output c;
output d;
output e;
wire b;
wire a;
wire c;
wire d;
reg e;
initial begin
c <= #10 (a+b);
d <= #10 a;
e <= #10 b;
end
endmodule
该代码合法吗?
答案 0 :(得分:3)
如何在10个时间单位或时钟之后一次性分配变量:
作为测试平台级别构造:
reg c,d,e;
initial begin
#10;
c = a+b;
d = a;
e = b;
end
对于RTL(合成),首先需要一个带时钟的测试平台 我会在testharness中生成这样的时钟:
reg clk ; //Rising edge every 10 timesteps
initial begin
clk = 0;
#5;
forever begin
#5 ;
clk = ~clk;
end
end
构建一个计数器,计数到10,一旦达到10,使触发器加载新值。
wire enable = (counter == 4'b10);
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
c <= 1'b0;
d <= 1'b0;
e <= 1'b0;
end
else if (enable) begin
c <= (a+b);
d <= a;
e <= b;
end
end
endmodule
额外的Verilog提示
输出是隐式线,无需重新定义它们。
非阻止分配<=
用于在推断触发器时始终@(posedge clk)
。
reg
或logic
块内分配 always
或initial
种类型。 wire
与assign
一起使用或用于端口之间的连接。