对于i=0
和j=0
,此代码使我的a,b,cin and s
信号为xxxxxxxx
。
对于i=0
和j=1
,我的a,b,cin and s
都是00000000
。对于i = 0 j = 0 cin = 0,我的加法器应该是哪个结果。怎么了?我确定我的加法器模块正确。
http://prntscr.com/lpngih(...等等)
大多数麻烦首先出现在for循环中,并在某些值未打印出来时开始,然后在每个循环中添加begin end
之后,我看到了上述问题的完整循环结果^ ^^^^。仍然不知道它是如何工作的,但确实是这样
module test_cla4_n;
reg [7:0] a,b;
reg cin;
wire [7:0] s;
wire cout;
integer i;
integer j;
integer cv;
cla4_n#(.n(8)) UUT
(.a(a), .b(b),
.cin(cin),
.s(s), .cout(cout));
initial
begin
for(cv=0;cv<=1;cv=cv+1)
begin
for (i=0;i<6;i=i+1)
begin
for (j=0;j<6;j=j+1)
begin
#100 a = j; b = i; cin = cv;
end
end
end
end
initial
begin
$monitor($time, ,"a=%9b, b=%9b, cin=%b, sum=%9b", a, b, cin, s);
end
endmodule
答案 0 :(得分:1)
只要您了解延迟是如何工作的,是否在工作分配之前或之后放置def PolynomialKernel(x,y,p):
return (np.matmul(x,y.T)+1)**p
def DualFunction(L):
return np.matmul((ytrain*ytrain),PolynomialKernel(xtrain,xtrain,1))-np.sum(L)
import scipy.optimize
cons = ({'type': 'eq',
'fun' : lambda L: np.array([np.matmul(L.T,ytrain)]),
'jac' : lambda L: np.array([np.sum(ytrain)])},
{'type': 'ineq',
'fun' : lambda L: np.array([L]),
'jac' : lambda L: np.array([1.0])})
result=scipy.optimize.minimize(DualFunction, L,constraints=cons, method='SLSQP', options={'disp': True})
result.x
延迟都没有关系。循环。
在显示的代码中,任何地方中唯一需要#100
/ begin
的地方是最里面的end
`循环。
答案 1 :(得分:1)
verilog中的所有4状态变量和网络都用'x'初始化。因此,在模拟中进行驱动之前,所有信号都将保持“ x”。
在测试台中,您在循环中使用#100延迟。在您的表达式中,这意味着紧随#100之后的所有分配都将在100个Verilog仿真周期(或您使用“时间标度”设置的任何值)之后发生。但是在此之前,您的所有值都将保持为“ x”。
现在,当#100触发时,您将具有以下内容:
#100
a = j; <-- 0
b = i; <-- 0
cin = cv; <-- 0
j = j + 1; <-- 1 << from the loop
您最终得到a = 0,b = 0,c = 0,并且j将变为'1'。
现在,您的仿真将开始并计算以上结果。您可以继续进行其余的模拟工作。
为使所有这些语句在#100之后的循环中发生,是的,您需要在它们周围添加开始/结束。否则,将仅在最内部的循环中评估第一条语句。这类似于任何编程语言。
for (j=0;j<6;j=j+1)
begin
#100 // wait here for 100 simulation ticks
a = j;
b = i;
cin = cv;
end