Python MyHDL自由变量

Python MyHDL自由变量,python,myhdl,Python,Myhdl,每当我在MD5的MyHDL实现中尝试调用此函数时,我都会遇到以下错误: File "/usr/local/lib/python2.7/dist-packages/myhdl/conversion/_misc.py", line 149, in raiseError raise ConversionError(kind, msg, info) myhdl.ConversionError: in file MD5-8, line 85: Free variable should be a Signa

每当我在MD5的MyHDL实现中尝试调用此函数时,我都会遇到以下错误:

File "/usr/local/lib/python2.7/dist-packages/myhdl/conversion/_misc.py", line 149, in raiseError
raise ConversionError(kind, msg, info)
myhdl.ConversionError: in file MD5-8, line 85:
Free variable should be a Signal or an int: calculate
这是整个脚本。如果有人对这件事或其他任何事情有任何了解,那将是非常有帮助的

非常感谢

from myhdl import *

def operative(M0,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,enable,clock):
    singletick = 0
    def toW32(x):
        return(modbv(x, min=0, max=2**32)[32:])
    def leftrotate(x, c): 
        return ((x<<c) | (x>>(32-c)) % (2**32))

    def calculate(M, A, B, C, D, count):
        KCONTENT = (0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391)
        SCONTENT = (7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22, 5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20, 4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23, 6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21)
        F = int(0)
        G = int(0)
        #get G and F
        if(count<=15):
            if(count >=0):
                F= (B&C)|((~B)&D)
                G = int(count)
        elif(count<=31):
            if(count >= 15):
                F = (D&B)|((~D)&C)
                G = int(5*count +1) % 16
        elif(count<=47):
            if(count>=32):
                F = (B^C^D)
                G = int(3*count+5) % 16
        elif(count <= 63):
            if(count >= 48):
                F = C^(B|(~D))
                G = int(7*count) % 16
        #swapping A through D and then calling again
        temp = D
        D = C
        C = B
        F = toW32(F)
        G = toW32(G)
        currentM = toW32(int(M[G]))
        currentK = toW32(int(KCONTENT[count]))
        currentS = toW32(int(SCONTENT[count]))
        #B = leftrotate((((A + F) % (2**32) + (M[G]+KCONTENT[count]) % (2**32)) % (2**32)), SCONTENT[count])
        A2 = toW32(A)
        F2 = toW32(F)
        bcomp0 = toW32((A2 + F2) % (2**32))
        bcomp1 = toW32((currentM + currentK) % (2**32))
        bcomp = toW32((bcomp0 + bcomp1) % (2**32))
        bcomp2 = (leftrotate(bcomp, currentS))

        B = toW32((B + bcomp2) % (2**32))
        A = temp
        print(B)
        if(count>=63):
            outA = (toW32((0x67452301+A) % (2**32)))
            outB = (toW32((0xefcdab89+B) % (2**32)))
            outC = (toW32((0x98badcfe+C) % (2**32)))
            outD = (toW32((0x10325476+D) % (2**32)))
            print(hex(concat(outA, outB, outC, outD)))
            return(outA, outB, outC, outD)
        else:
            count = count + 1
            calculate(M, A, B, C, D, count)





    HALF_PERIOD = delay(10)
    @always(HALF_PERIOD)
    def clockGen():
        clock.next = not clock


    M = (M0,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15) 
    @always(clock.posedge) 
    def central():
        if(enable == 1):
            A = toW32(0x67452301)
            B = toW32(0xefcdab89)
            C = toW32(0x98badcfe)
            D = toW32(0x10325476)
            count = toW32(0)
            final = int(0)
            final = calculate(M, A, B, C, D, count)

    return clockGen, central
从myhdl导入*
def工作(M0、M1、M2、M3、M4、M5、M6、M7、M8、M9、M10、M11、M12、M13、M14、M15、启用、时钟):
singletick=0
def toW32(x):
返回(modbv(x,最小值=0,最大值=2**32)[32:]
def左旋转(x,c):
回报率((x(32-c))%(2**32))
def计算(M、A、B、C、D、计数):
K含量=(0xD7676AA478,0xD7676AAA478,0xE7C77B756,0xC777FF57COF,0x4787c62a,0xa8304613,0xFD464613,0xfd469501,0x69808098D8,0xD76767协协协协协协协协协协协协协协协协协协协协协协协协协协协协协协协协协协协协协7 7 7 7 7 7 7 7 7 7协协协协协协协协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协7协,0xC7协8协8协8协8协8协8协8协8协,9e3e905,0这些基金包括一个F8,0x676f02d9,0x8D2A88A88A88A8A88A88,0xfffa3942,0x8771f681 1,0x6D66D61122,0xF6D6D6D61386,0x66F6-F6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6,0xF687 7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 8 18 18 18 19 19 19 19 19 19 19 19 0,0xa3014314、0x4e0811a1、0xf7537e82、0xbd3af235、0x2ad7d2bb、0xeb86d391)
SCONTENT=(7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,14,20,5,9,14,20,4,11,16,23,4,23,11,16,23,6,10,15,21,6,10,21,6,10,15,21)
F=int(0)
G=int(0)
#得到G和F
如果(计数=0):
F=(B&C)|(~B)&D)
G=int(计数)
elif(计数=15):
F=(D&B)|(~D)&C)
G=int(5*计数+1)%16
elif(计数=32):
F=(B^C^D)
G=int(3*计数+5)%16
elif(计数=48):
F=C^(B|(~D))
G=整数(7*计数)%16
#交换A到D,然后再次呼叫
温度=D
D=C
C=B
F=32(F)
G=32(G)
电流M=toW32(int(M[G]))
currentK=toW32(int(KCONTENT[count]))
电流=牵引32(int(SCONTENT[count]))
#B=左旋转(((A+F)%(2**32)+(M[G]+K内容[计数])%(2**32))%(2**32)),内容[计数])
A2=32(A)
F2=32(F)
bcomp0=toW32((A2+F2)%(2**32))
bcomp1=toW32(电流M+K)%(2**32))
bcomp=toW32((bcomp0+bcomp1)%(2**32))
bcomp2=(左旋转(bcomp,电流))
B=toW32((B+bcomp2)%(2**32))
A=温度
印刷品(B)
如果(计数>=63):
outA=(toW32((0x67452301+A)%(2**32)))
outB=(toW32((0xefcdab89+B)%(2**32)))
outC=(toW32((0x98badcfe+C)%(2**32)))
outD=(toW32((0x10325476+D)%(2**32)))
打印(十六进制(concat(outA,outB,outC,outD)))
返回(outA、outB、outC、outD)
其他:
计数=计数+1
计算(M、A、B、C、D、计数)
半周期=延迟(10)
@始终(半周期)
def clockGen():
clock.next=非时钟
M=(M0、M1、M2、M3、M4、M5、M6、M7、M8、M9、M10、M11、M12、M13、M14、M15)
@始终(clock.posedge)
def central():
如果(启用==1):
A=toW32(0x67452301)
B=toW32(0xefcdab89)
C=toW32(0x98badcfe)
D=toW32(0x10325476)
计数=32(0)
最终=整数(0)
最终=计算(M、A、B、C、D、计数)
返回时钟发生器,中央

其他:
下,尝试将
计算(M,A,B,C,D,count)
更改为
返回计算(M,A,B,C,D,count)
。在这种情况下计算的返回值永远不会被当前代码使用,这将导致尝试在
posedge
块下设置
final=None
。请同时标记哪些行有错误?谢谢!还有,请更改变量名!如果您丢失了在时序图中,您将无法理解自己的代码!例如,从名称来看,我不清楚您是否真的希望
calculate
修改其参数并将其返回原位(这在Python中是不可变的),或者您是否计划返回新值(如果是后者,posedge块实际上从未使用过这些值)。谢谢,我会尝试这样做,我非常感谢你的建议!当然!请让我知道它是如何运行的。在
下:
,尝试将
计算(M,A,B,C,D,count)
更改为
返回计算(M,A,B,C,D,count)
。在这种情况下计算的返回值永远不会被当前代码使用,这将导致尝试在
posedge
块下设置
final=None
。请同时标记哪些行有错误?谢谢!还有,请更改变量名!如果您丢失了在时序图中,您将无法理解自己的代码!例如,从名称来看,我不清楚您是否真的希望
calculate
修改其参数并将其返回原位(这在Python中是不可变的),或者您是否计划返回新值(如果是后者,posedge块实际上从未使用过这些值)。谢谢,我会尝试一下,我真的很感谢你的建议!当然!请让我知道它是如何运行的。